2016-04-18 6 views
6

Ich versuche, Repository im Controller mit Feder Annotation Autowire. Ich erhalte den Fehler org.springframework.data.repository.query.QueryByExampleExecutor class not found, für den ich keine Lösung finden konnte.Ich kann Repository im Frühjahr nicht autowire

Fehler, die ich erhalte:

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

I-Repository mit @Repository kommentiert haben. Nach der Frühjahrsdokumentation habe ich nur Repository-Schnittstelle. Ist es richtig?

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

Ich habe jpa:repositories mit korrekten base-package und component-scan enthalten. Ich habe angegeben, dass es Annotation angetrieben wird (<mvc:annotation-driven /> <tx:annotation-driven />) und hinzugefügt JDBC und JPA-Einstellungen. Mein applicationContext.xml richtig aus web.xml geladen

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

Der Stack-Trace ist klar: Ihnen fehlen die Spring Data-JARs aus Ihrem CLASSPATH. – duffymo

+2

'NoClassDefFoundError' bedeutet fast immer eine Versionskonflikt. In diesem Fall glaube ich, dass Sie die RC-Versionen (oder zumindest die neuesten Release-Versionen) benötigen, um eine Abfrage zu erhalten. – chrylis

+1

Ich habe 'spring-data-commons' von Version 1.11.4 auf 1.12.1 aktualisiert und das Problem behoben. Danke @chrylis – Black

Antwort

7

Ihr Problem betrifft Abhängigkeiten.

Die Klasse, die Sie suchen ist hier: https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/JpaRepository.java

Wie Sie sehen können, die neueste Version des Frühlings-data-JPA hat es daher sollten Sie entweder aktualisieren Sie Ihre Fehler delendency auf die neueste Version oder downdrade spring-data-jpa Version ein wenig (nicht empfohlen).

Ich hatte ähnliches Problem in meiner Anwendung mit Spring Boot und MongoDB Jpa Repositories.

Als Beispiel habe ich Feder-data-JPA und Feder-data-mongodb Abhängigkeiten:

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

Aber der Frühling Boot-Feder-boot-Starter-data-JPA implizit eine ältere Version von Feder-Daten -mongodb als 1.9.2.RELEASE. Der einfachste Weg, um zu beheben, war Spring-Data-Mongodb zu 1.8.4.RELEASE Version downgraden.

0

Versuchen Sie, diese Konfiguration in Ihrer applicationContext.xml hinzufügen

<context:annotation-config/> 
+0

Laut Antwort auf [http://stackoverflow.com/a/7456501/1997088](http://stackoverflow.com/a/7456501/1997088) '' kann Arbeit machen von '' und annotation-config ist dann nicht erforderlich – Black

-3

Bitte ändern Sie das

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

zu

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

Es ist das definieren Basispaket mit diesem Sie com.payforeign.article wird automatisch scannen.

-1

Sie können auf NoClassDefFoundError stoßen, wenn die Version spring-data-commons älter ist als von spring-data-jpa erforderlich. Diese Ausnahme bedeutet fast immer eine Versionskonflikt.Hier ist ein Beispiel für eine solche schlechte Abhängigkeit Kombination:

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

Die Lösung ist so einfach wie spring-data-commons aus dem Projekt Abhängigkeiten zu entfernen (sowieso brauchen Sie nicht explizit diese Bibliothek angeben, weil es eine transitive Abhängigkeit von spring-data-jpa ist).