2016-04-18 11 views
6

Próbuję wyposażyć repozytorium w kontroler przy użyciu adnotacji wiosennej. Otrzymuję komunikat o błędzie org.springframework.data.repository.query.QueryByExampleExecutor class not found, dla którego nie mogłem znaleźć rozwiązania.Nie mogę automatycznie wyposażyć repozytorium na wiosnę

Błąd, który otrzymuję:

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 

Controller

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

Mam repozytorium z adnotacją @Repository. Według dokumentacji wiosennej mam tylko interfejs repozytorium. Czy to jest poprawne?

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

mam włączone jpa:repositories z prawidłowym base-package i component-scan. Podałem, że jest on oparty na adnotacji (<mvc:annotation-driven /> <tx:annotation-driven />) i dodano ustawienia JDBC i JPA. Moja applicationContext.xml jest prawidłowo załadowany z 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> 
+1

Śledzenie stosu jest jasne: brakuje panu JARów danych sprężyn ze swojej ścieżki CLASSPATH. – duffymo

+2

'NoClassDefFoundError' prawie zawsze oznacza niedopasowanie wersji. W tym przypadku, sądzę, że potrzebujesz wersji RC (lub przynajmniej najnowszych wersji), aby uzyskać zapytanie za przykładem. – chrylis

+1

Zaktualizowałem 'spring-data-commons' z wersji 1.11.4 do 1.12.1 i naprawiłem błąd. Dzięki @chrylis – Black

Odpowiedz

7

Twój problem dotyczy zależności.

Klasa, szukasz jest tutaj: https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/JpaRepository.java

Jak widać, najnowsza wersja wiosenno-data-WZP ma, dlatego należy albo uaktualnić zepsuty delendency do najnowszej wersji lub downdrade wersja wiosna-dane-jpa trochę (niezalecane).

Miałem podobny problem w mojej aplikacji z repozytoriami rozruchowymi i mongoDB jpa.

Jako przykład mam wiosna-data-WZP i sprężyną danych MongoDB zależności:

<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> 

Ale bagażnika wiosna-boot-rozrusznik-data-JPA domyślnie używa starszej wersji wiosenno-danych -mongodb niż 1.9.2.RELEASE. Najprostszym sposobem naprawy było obniżenie wersji sprężynowej-mongodb do wersji 1.8.4.RELEASE.

0

Spróbuj dodać ten config w applicationContext.xml

<context:annotation-config/> 
+0

Zgodnie z odpowiedzią na [http://stackoverflow.com/a/7456501/1997088](http://stackoverflow.com/a/7456501/1997088) '' może wykonać zadanie '' i adnotacja-config nie są wtedy wymagane – Black

-3

Proszę zmienić

<context:component-scan base-package="com.payforeign,com.payforeign.article" /> 

do

<context:component-scan base-package="com.payforeign" /> 

Jest to definicja pakiet podstawowy za pomocą tego zostanie automatycznie przeskanowany pod numerem com.payforeign.article.

-1

Możesz napotkać NoClassDefFoundError, jeśli wersja spring-data-commons jest starsza niż wymagana przez spring-data-jpa. Ten wyjątek prawie zawsze oznacza niezgodność wersji.Oto przykład takiej złej kombinacji zależność:

<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> 

Rozwiązanie jest tak proste jak usuwanie spring-data-commons ze swoimi zależnościami projektu (w każdym razie nie trzeba jawnie określić tej biblioteki przyczyną jest to przechodnia zależność spring-data-jpa).