2016-04-18 24 views
6

Tôi đang cố gắng tự động lưu trữ trong bộ điều khiển bằng cách sử dụng chú thích mùa xuân. Tôi nhận được lỗi org.springframework.data.repository.query.QueryByExampleExecutor class not found mà tôi không thể tìm thấy giải pháp.Tôi không thể tự động lưu trữ vào mùa xuân

Lỗi mà tôi nhận được:

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 

khiển

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

tôi đã chú thích kho với @Repository. Theo tài liệu mùa xuân, tôi chỉ có giao diện kho lưu trữ. Nó có đúng không?

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

Tôi đã bao gồm jpa:repositories với đúng base-packagecomponent-scan. Tôi đã xác định rằng nó được điều khiển chú thích (<mvc:annotation-driven /> <tx:annotation-driven />) và thêm cài đặt JDBC và JPA. applicationContext.xml tôi được nạp một cách chính xác từ 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

Dấu vết ngăn xếp rõ ràng: Bạn đang thiếu các JAR dữ liệu mùa xuân từ CLASSPATH của bạn. – duffymo

+2

'NoClassDefFoundError' gần như luôn luôn có nghĩa là một phiên bản không khớp. Trong trường hợp này, tôi tin rằng bạn cần các phiên bản RC (hoặc ít nhất là phiên bản phát hành mới nhất) để có được truy vấn theo ví dụ. – chrylis

+1

Tôi đã nâng cấp 'spring-data-commons' từ phiên bản 1.11.4 lên 1.12.1 và nó đã khắc phục sự cố. Thanks @chrylis – Black

Trả lời

7

Sự cố của bạn là về các phụ thuộc.

Lớp, bạn đang tìm kiếm là đây: https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/JpaRepository.java

Như bạn có thể thấy, phiên bản mới nhất của mùa xuân-data-JPA có nó, do đó bạn nên hoặc nâng cấp delendency thất bại của mình lên phiên bản mới nhất hoặc downdrade spring-data-jpa phiên bản một chút (không khuyến khích).

Tôi đã gặp sự cố tương tự trong ứng dụng của mình với kho khởi động mùa xuân và kho lưu trữ mongoDB jpa.

Như Ví dụ, tôi có mùa xuân-data-JPA và lò xo dữ liệu MongoDB phụ thuộc:

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

Nhưng khởi động mùa xuân mùa xuân-boot-khởi-data-JPA ngầm sử dụng một phiên bản cũ của lò xo dữ liệu -mongodb hơn 1.9.2.RELEASE. Cách dễ nhất để khắc phục là hạ cấp phiên bản spring-data-mongodb xuống 1.8.4.RELEASE.

0

Cố gắng thêm cấu hình này trong applicationContext.xml bạn

<context:annotation-config/> 
+0

Theo câu trả lời trên [http://stackoverflow.com/a/7456501/1997088] (http://stackoverflow.com/a/7456501/1997088) '' có thể thực hiện công việc của '' và chú thích-config thì không cần thiết – Black

-3

Xin hãy đổi các

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

để

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

Nó xác định gói cơ sở bằng cách sử dụng này, bạn com.payforeign.article sẽ tự động quét.

-1

Bạn có thể gặp phải NoClassDefFoundError nếu phiên bản spring-data-commons cũ hơn sau đó được yêu cầu bởi spring-data-jpa. Ngoại lệ này gần như luôn luôn có nghĩa là một phiên bản không khớp.Dưới đây là một ví dụ về sự kết hợp phụ thuộc xấu như:

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

Giải pháp là đơn giản như loại bỏ spring-data-commons từ phụ thuộc dự án của bạn (anyway bạn không cần phải xác định một cách rõ ràng thư viện này nguyên nhân đó là một sự phụ thuộc bắc cầu của spring-data-jpa).

Các vấn đề liên quan