Exception NoClassDefFoundError cho CacheProvider


93

Tôi là người mới sử dụng Spring và hibernate nên tôi đang cố gắng triển khai một số ứng dụng web đơn giản dựa trên Spring 3 + hibernate 4 trong khi khởi động tomcat Tôi có ngoại lệ này:

java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
    ...
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.CacheProvider
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)

Tôi thấy rằng lớp này ở trong hibernate-core cho hibernate 3 nhưng tôi không tìm thấy nó trong hibernate 4.

Một phần của context.xml của tôi cho sự bền bỉ:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:oracle:thin:@IP_Address:SID"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>
    <property name="initialSize" value="5"/>
    <property name="maxActive" value="20"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.huawei.vms.user"/>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
        </props>
    </property>
</bean>

Vui lòng giúp tôi tìm hiểu lý do tại sao nó đang cố gắng tải CacheProvider vì tôi không có bất kỳ cài đặt nào cho điều đó trong context.xml và tôi phải thêm jar nào trong dự án của mình. Cảm ơn!


bạn có thể đăng tệp cấu hình ngủ đông không?
Cornel Creanga

Tôi không có nó. Có thể đó là sự hiểu lầm và tôi phải nói thêm rằng tôi đã làm chính xác những gì đã được mô tả trong cuốn sách "Spring in action 3", chương "5.4 Tích hợp Ngủ đông với Mùa xuân". Trong khi làm điều đó, tôi gặp một số vấn đề với các lớp vắng mặt mà tôi tìm thấy trong chế độ ngủ đông, vì vậy tôi đã thêm hibernate 4 vào dự án của mình. Nhưng nó không phải là enouph
Fedor Skrynnikov

1
bạn có chắc ngủ đông 4 có lớp đó không? Tôi sẽ thử ngủ đông 3.6.x
Bozho

Không. Tôi không tìm thấy nó trong phiên bản 4. Thực ra, tôi đã tìm thấy nó nhưng ở một gói khác trong ehcache. Nhưng câu hỏi là tại sao tomcat trys để tải nó? Và nó có thực sự cần thiết không?
Fedor Skrynnikov

Nó bị phản đối từ những gì tôi biết
Cornel Creanga

Câu trả lời:


184

Thay đổi AnnotationSessionFactoryBean của bạn thành org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) và bạn sẽ sẵn sàng. AnnotationSessionFactoryBean đã được thay thế bằng LocalSessionFactoryBean vì nó thực hiện quét đường dẫn lớp bây giờ.


Bất kỳ ý tưởng khả thi khác? Điều này dường như không làm bất cứ điều gì cho tôi. Các thuộc tính có cần thay đổi không?
zod

3
Đảm bảo rằng bạn đã thay đổi gói từ hibernate3 thành hibernate4 - LocalSessionFactoryBean tồn tại trong cả hai gói. Bạn đang sử dụng phiên bản Spring và Hibernate nào?
Aaron Douglas

11

Điều này có thể do những thay đổi được giới thiệu trong Hibernate 4 không tương thích với hỗ trợ Spring cho Hibernate. Đây vấn đề đàm phán về việc thêm gói riêng biệt để hỗ trợ Hibernate 4. Bạn sẽ cần mùa xuân 3.1 cho việc này. Tùy chọn khác là gắn vào chế độ ngủ đông 3 nếu bạn không cần bất kỳ tính năng cụ thể nào được giới thiệu trong 4.


Đúng. Tôi đã hạ cấp từ hiberante 4 xuống phiên bản 3.6.7 và mọi thứ đã hoạt động. Cảm ơn!
Fedor Skrynnikov

1
+1, nó hoạt động theo lời khuyên của cả bạn và Aaron . (Hay chính xác hơn, đã vượt qua điều này và gặp phải các vấn đề khác ở chế độ Hibernate 4.: P) Nhân tiện, Spring 3.1 không còn trong RC (bản phát hành GA đầu tiên vào tháng 12 năm 2011).
Jonik

thx @gkamal. Hạ cấp phiên bản thành hibernate 3 phù hợp với tôi. Giải pháp: Tôi đã sử dụng hibernate-entitymanager và hibernate-core, cả hai phiên bản 3.6.10. Cuối cùng, hãy xem mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be

8

cập nhật AnnotationSessionFactoryBean thành hibernate4 hoạt động hoàn hảo. Ngoài ra, hãy đảm bảo rằng transactionManager của bạn cũng trỏ đến hibernate4,

<bean id="sessionFactory"
 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 <property name="dataSource" ref="dataSource"></property>
 <property name="packagesToScan" value="PACKAGE_NAME"></property>
 <property name="hibernateProperties">
    <props>
        <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
    </props>
 </property>    
</bean>

<bean id="transactionManager" 
  class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

0

Một vấn đề thực sự đơn giản sẽ gây ra cùng một lỗi đơn giản là có sự không khớp giữa phiên bản ngủ đông trong pom (4.something) và phiên bản được chỉ định trong cấu hình mùa xuân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.