Exception NoClassDefFoundError pour CacheProvider


93

Je suis un peu nouveau dans Spring et hibernate, donc j'essaie d'implémenter une application Web simple basée sur Spring 3 + hibernate 4 pendant que je démarre tomcat.J'ai cette exception:

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)

J'ai trouvé que cette classe était en hibernate-core pour hibernate 3 mais je ne l'ai pas trouvée dans hibernate 4.

La partie de mon context.xml pour la persistance:

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

S'il vous plaît, aidez-moi à comprendre pourquoi il essaie de charger CacheProvider car je n'ai pas de paramètres pour cela dans context.xml et quel fichier jar je dois ajouter à mon projet. Merci!


pouvez-vous publier le fichier de configuration de mise en veille prolongée?
Cornel Creanga

Je ne l'ai pas. C'est peut-être un malentendu et je dois ajouter que j'ai fait exactement ce qui a été décrit dans le livre "Spring in action 3", chapitre "5.4 Intégrer Hibernate avec Spring". Pendant que je faisais cela, j'ai eu quelques problèmes avec les classes absentes que j'ai trouvées dans hibernate, j'ai donc ajouté hibernate 4 dans mon projet. Mais ce n'était pas assez
Fedor Skrynnikov

1
êtes-vous sûr que hibernate 4 a cette classe? J'essaierais Hibernate 3.6.x
Bozho

Non, je ne l'ai pas trouvé dans la version 4. En fait, je l'ai trouvé mais dans un autre paquet dans ehcache. Mais la question est de savoir pourquoi Tomcat essaie de le charger? Et est-ce vraiment nécessaire?
Fedor Skrynnikov

C'est obsolète d'après ce que je sais
Cornel Creanga

Réponses:


184

Remplacez votre AnnotationSessionFactoryBean par org.springframework.orm.hibernate4.LocalSessionFactoryBean (Hibernate 4) et vous serez prêt à partir. AnnotationSessionFactoryBean a été remplacé par LocalSessionFactoryBean comme il le fait actuellement pour l'analyse du chemin de classe.


D'autres idées possibles? Cela ne semble rien faire pour moi. Les propriétés doivent-elles être modifiées?
zod

3
Assurez-vous que vous avez changé le paquet de hibernate3 à hibernate4 - un LocalSessionFactoryBean existe dans les deux paquets. Quelle version de Spring et Hibernate utilisez-vous?
Aaron Douglas

11

Cela peut être dû à des changements introduits dans Hibernate 4 qui ne sont pas compatibles avec la prise en charge de Spring pour Hibernate. Ce numéro parle de l'ajout d'un package séparé pour prendre en charge la mise en veille prolongée 4. Vous aurez besoin du printemps 3.1 pour cela. L'autre option est de s'en tenir à la mise en veille prolongée 3 si vous n'avez besoin d'aucune fonctionnalité spécifique introduite dans 4.


Oui. J'ai rétrogradé de hiberante 4 à la version 3.6.7 et tout est devenu opérationnel. Merci!
Fedor Skrynnikov le

1
+1, je l'ai fait fonctionner avec vos conseils et ceux d' Aaron . (Ou plus précisément, j'ai dépassé cela et rencontré d'autres problèmes Hibernate 4.: P) Au fait, Spring 3.1 n'est plus en RC (première version GA en décembre 2011).
Jonik

merci @gkamal. Le down-versioning pour Hibernate 3 a fonctionné pour moi. Solution: j'ai utilisé hibernate-entitymanager et hibernate-core, tous deux version 3.6.10.Final voir mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be

8

la mise à jour de AnnotationSessionFactoryBean vers hibernate4 fonctionne parfaitement. Assurez-vous également que votre transactionManager pointe également vers 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

Un problème très simple qui causera la même erreur est simplement d'avoir une discordance entre la version hibernate dans le pom (4. quelque chose) et la version spécifiée dans la configuration de printemps.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.