Ausnahme NoClassDefFoundError für CacheProvider

93

Ich bin ein bisschen neu in Spring und im Ruhezustand, daher versuche ich, eine einfache Webanwendung zu implementieren, die auf Spring 3 + Hibernate 4 basiert, während ich Tomcat starte. Ich habe diese Ausnahme:

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)

Ich habe festgestellt, dass sich diese Klasse im Ruhezustand-Kern für Ruhezustand 3 befindet, aber ich habe sie im Ruhezustand 4 nicht gefunden.

Der Teil meiner context.xml für die Persistenz:

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

Bitte helfen Sie mir herauszufinden, warum CacheProvider geladen werden soll, da ich in context.xml keine Einstellungen dafür habe und welche JAR ich in meinem Projekt hinzufügen muss. Vielen Dank!

Fedor Skrynnikov
quelle
Können Sie die Konfigurationsdatei für den Ruhezustand veröffentlichen?
Cornel Creanga
Ich habe es nicht Vielleicht ist es ein Missverständnis und ich muss hinzufügen, dass ich genau das getan habe, was in Buch "Frühling in Aktion 3", Kapitel "5.4 Hibernate mit Frühling integrieren" beschrieben wurde. Während ich das tat, hatte ich einige Probleme mit fehlenden Klassen, die ich im Ruhezustand fand, also fügte ich meinem Projekt den Ruhezustand 4 hinzu. Aber es war nicht genug
Fedor Skrynnikov
1
Sind Sie sicher, dass Hibernate 4 diese Klasse hat? Ich würde versuchen, Ruhezustand 3.6.x
Bozho
Nein, ich habe es in Version 4 nicht gefunden. Eigentlich habe ich es gefunden, aber in einem anderen Paket in ehcache. Aber die Frage ist, warum Tomcat versucht, es zu laden? Und wird es tatsächlich benötigt?
Fedor Skrynnikov
Es ist veraltet von dem, was ich weiß
Cornel Creanga

Antworten:

184

Ändern Sie Ihre AnnotationSessionFactoryBean in org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) und Sie können loslegen. Die AnnotationSessionFactoryBean wurde durch die LocalSessionFactoryBean ersetzt, da jetzt das Scannen von Klassenpfaden durchgeführt wird.

Aaron Douglas
quelle
Irgendwelche anderen möglichen Ideen? Das scheint nichts für mich zu tun. Müssen die Eigenschaften geändert werden?
Zod
3
Stellen Sie sicher, dass Sie das Paket von hibernate3 in hibernate4 geändert haben. In beiden Paketen ist eine LocalSessionFactoryBean vorhanden. Welche Version von Spring and Hibernate verwenden Sie?
Aaron Douglas
11

Dies kann auf Änderungen in Hibernate 4 zurückzuführen sein, die nicht mit der Spring-Unterstützung für Hibernate kompatibel sind. In dieser Ausgabe wird über das Hinzufügen eines separaten Pakets zur Unterstützung von Ruhezustand 4 gesprochen. Dazu benötigen Sie Spring 3.1. Die andere Möglichkeit besteht darin, sich an den Ruhezustand 3 zu halten, wenn Sie keine in 4 eingeführte spezielle Funktion benötigen.

gkamal
quelle
Ja. Ich habe von Hiberante 4 auf Version 3.6.7 heruntergefahren und alles hat funktioniert. Vielen Dank!
Fedor Skrynnikov
1
+1, hat es mit deinem und Aarons Rat funktioniert . (Oder genauer gesagt, habe dies überwunden und bin auf andere Hibernate 4-Probleme gestoßen .: P) Übrigens ist Spring 3.1 nicht mehr in RC (erste GA-Veröffentlichung im Dezember 2011).
Jonik
Danke @gkamal. Die Downversionierung in den Ruhezustand 3 hat bei mir funktioniert. Lösung: Ich habe Hibernate-Entitymanager und Hibernate-Core verwendet, beide Version 3.6.10. Endgültig siehe mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

Das Aktualisieren von AnnotationSessionFactoryBean auf hibernate4 funktioniert einwandfrei. Stellen Sie außerdem sicher, dass Ihr transactionManager auch auf hibernate4 zeigt.

<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>
Vishal Jagtap
quelle
0

Ein wirklich einfaches Problem, das den gleichen Fehler verursacht, besteht einfach darin, dass die Version im Ruhezustand im POM (4.something) nicht mit der in der Spring-Konfiguration angegebenen Version übereinstimmt.

John Lockwood
quelle