Получение ClassNotFoundException при использовании Hibernate 3.6.3 и только что добавленного DefaultPreUpdateEventListener внутри Tomcat - PullRequest
2 голосов
/ 24 апреля 2011

У меня есть проблема, которая использовала Hibernate 3.6.0 в течение очень долгого времени (или версий здесь). Этот проект находится в разработке с 2009 года и медленно, но верно обновляет версии Hibernate. Некоторое время он использует 3.6.x.

Я попытался обновить систему до 3.6.3, чтобы посмотреть, решит ли она проблему - не сделал. Мои тесты все еще выполняются.

Я только недавно создал реализацию для DefaultPreUpdateEventListener. Он прекрасно работает, когда я тестирую его в IntelliJ. Это работает, когда я запускаю тесты в Maven. Однако, когда я запускаю свое приложение в Tomcat, я получаю эту глупую ошибку classpath:

Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [trainingdividend.dao.UpdatedOnEventListener] for bean with name 'trainingdividend.dao.UpdatedOnEventListener#1342f5b' defined in file [C:\Users\egervari\IdeaProjects\trainingdividend-experiment\target\classes\applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:433)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270)
    ... 118 more
Caused by: java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1026)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1483)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
    ... 120 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.event.def.DefaultPreUpdateEventListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    ... 136 more

Это не имеет смысла. У меня не было проблем с запуском Hibernate до этого момента. Никто. Почему вдруг у меня возникают проблемы с адом? Я имею в виду, это работает в модульных / интеграционных тестах!

Я действительно ненавижу такие проблемы. Буду признателен, если кто-нибудь сможет помочь. Я потратил 2 часа, пытаясь выяснить, что случилось, но я не вижу проблем. Мои зависимости maven выглядят хорошо - загружается только 1 версия Hibernate.

В такие моменты я бы хотел использовать Rails. Я сомневаюсь, что они когда-либо мирились с этим дерьмом.

Вот моя весенняя конфигурация Hibernate:

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="eventListeners">
        <map>
            <entry key="pre-update">
                <bean class="trainingdividend.dao.UpdatedOnEventListener" />
            </entry>
        </map>
    </property>
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
            <value>hibernate/coursetemplate.hbm.xml</value>
            <value>hibernate/address.hbm.xml</value>
            <value>hibernate/user.hbm.xml</value>
            <value>hibernate/trainee.hbm.xml</value>
            <value>hibernate/company.hbm.xml</value>
            <value>hibernate/instructor.hbm.xml</value>
            <value>hibernate/module.hbm.xml</value>
            <value>hibernate/sysadmin.hbm.xml</value>
        </list>
    </property>
    <property name="namingStrategy">
        <bean class="org.hibernate.cfg.ImprovedNamingStrategy"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="javax.persistence.validation.mode">none</prop>

            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}
            </prop>
            <prop key="hibernate.generate_statistics">false</prop>

            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>

            <prop key="hibernate.cache.use_second_level_cache">false</prop>
            <prop key="hibernate.cache.provider_class">
                org.hibernate.cache.EhCacheProvider
            </prop>
        </props>
    </property>
</bean>

Ответы [ 2 ]

1 голос
/ 24 апреля 2011

проверьте, что банки включены в путь к классу. попробуйте положить jar в tomcat lib.

если вы используете пользовательские прослушиватели, то пытались ли вы явно добавить прослушиватели в конфигурацию?

<event type="load">
            <listener class="com.eg.MyLoadListener"/>
            <listener class="org.hibernate.event.def.DefaultLoadEventListener"/>
</event>

или вы можете реализовать org.hibernate.event.PreUpdateEventListener

0 голосов
/ 24 апреля 2011

Если вы загрузите исходный код hibernate 3.6.3, вы увидите, что этот класс не существует. Поэтому я подозреваю, что если вы перекомпилируете ваш trainingdividend.dao.UpdatedOnEventListener с указанием его пути к классу в hibernate 3.6.3, вы увидите, что это не работает (если честно, я также проверил Hibernate 3.3.2, и там тоже нет)

Вам нужно будет реализовать свой собственный вариант интерфейса PreUpdateEventListener - который существует.

...