Spring注釈を使用して、コントローラのリポジトリを自動配線しようとしています。解決策が見つからないエラーorg.springframework.data.repository.query.QueryByExampleExecutor class not found
が発生します。
私が得ているエラー:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.payforeign.article.ArticleRepository com.payforeign.article.ArticleController.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleRepository': Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: org/springframework/data/repository/query/QueryByExampleExecutor
コントローラ
package com.payforeign.article;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/service")
public class ArticleController {
@Autowired
private ArticleRepository repository;
//controller methods
}
リポジトリ
@Repository
でリポジトリに注釈を付けました。春のドキュメントによると、私はリポジトリインターフェイスしか持っていません。それが正しいか?
package com.payforeign.article;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ArticleRepository extends CrudRepository<Article, Long> {}
applicationContext.xml
正しいjpa:repositories
およびbase-package
とともにcomponent-scan
を含めました。注釈駆動型(<mvc:annotation-driven /> <tx:annotation-driven />
)であることを指定し、JDBCおよびJPA設定を追加しました。私のapplicationContext.xmlはweb.xmlから正しく読み込まれます
<?xml version='1.0' encoding='UTF-8' ?>
<beans ...>
<context:component-scan base-package="com.payforeign,com.payforeign.article" />
<mvc:annotation-driven />
<jpa:repositories base-package="com.payforeign.article" />
<!-- Data Source -->
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/payforeign" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!-- Hibernate -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.payforeign.article" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="database" value="MYSQL" />
</bean>
</property>
</bean>
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
あなたの問題は依存関係についてです。
あなたが探しているクラスはここにあります: https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/Java/org/springframework/data/jpa/ repository/JpaRepository.Java
ご覧のように、spring-data-jpaの最新バージョンにはそれが含まれているため、失敗した遅延を最新バージョンにアップグレードするか、spring-data-jpaバージョンを少しダウングレードする必要があります(非推奨)。
私のアプリケーションでは、スプリングブートとmongoDB jpaリポジトリを使用して同様の問題が発生しました。
例として、spring-data-jpaとspring-data-mongodbの依存関係があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.2.RELEASE</version>
</dependency>
ただし、スプリングブートspring-boot-starter-data-jpaは1.9.2.RELEASEよりも古いバージョンのspring-data-mongodbを暗黙的に使用します。修正する最も簡単な方法は、spring-data-mongodbを1.8.4.RELEASEバージョンにダウングレードすることでした。
spring-data-commons
のバージョンがspring-data-jpa
が必要とするバージョンより古い場合、NoClassDefFoundError
が発生する可能性があります。この例外は、ほとんど常にバージョンの不一致を意味します(依存関係の地獄)。そのような悪い依存関係の組み合わせの例を次に示します。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.6.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.8.RELEASE</version>
</dependency>
ソリューションは、プロジェクトの依存関係からspring-data-commons
を削除するのと同じくらい簡単です(とにかく、このライブラリを明示的に指定する必要がないため、spring-data-jpa
の推移的な依存関係になります)。
この設定をapplicationContext.xmlに追加してみてください
<context:annotation-config/>