NoClassDefFoundError org.springframework.orm.hibernate4.HibernateTemplate $ 35

时间:2014-08-18 13:24:29

标签: java spring classloader noclassdeffounderror timertask

请查看并提供建议。 我完全迷失了这个例外。 它发生在spring-orm-4.0.6.RELEASE.jar中,它看起来像是一些类加载问题。 我的WEB-INF \ lib中有 spring-orm-4.0.6 .RELEASE.jar,我确实有 hibernate-core-4.3.6 .Final。那里的罐子, 我试图在Apache Tomcat / 6.0.20下运行这个应用程序(是的,很老了,因为我试图刷新的项目) 我无法理解为什么classloader能够加载HibernateTemplate,但无法加载HibernateTemplate $ 35,他们坐在同一个jar中的同一个dir ...

java.lang.NoClassDefFoundError: org.springframework.orm.hibernate4.HibernateTemplate$35
        at org.springframework.orm.hibernate4.HibernateTemplate.findByCriteria(HibernateTemplate.java:1011)
        at org.springframework.orm.hibernate4.HibernateTemplate.findByCriteria(HibernateTemplate.java:1003)
        at xxx.xxx.SelectionDAO.list(SelectionDAO.java:142)

调用hibernate的代码:

  @SuppressWarnings({ "unchecked", "rawtypes" })
  public <Entity> List<Entity> list(final Class<Entity> entityClass) {
      DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
      return (List)getHibernateTemplate().findByCriteria(criteria);
  }

只是为了澄清,我使用的是org.springframework.orm。 hibernate4 .HibernateTemplate

也许这也很有意义,但我发现这个代码是从

调用的
private void startSessionClean() {
    TimerTask task = new TimerTask() {
        public void run() {
            try {
                  dao.list(UserSessions.class);
            } catch (Throwable throwable) {
                throwable.printStackTrace();        
                log.error("Error in session cleaner", throwable);
            }
        }
    };
    timer.scheduleAtFixedRate(task, DELAY, DELAY);
}

所以我猜这可能会以某种方式与不同的Thread类加载器相关联?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

查看HibernateTemplate的javadoc,尝试将其转换为新样式sessionFactory.getCurrentSession()

答案 1 :(得分:0)

我将TimerTask的实现更改为由TaskScheduler运行的spring spring runnable并且问题消失了