Hibernate NoSuchFieldError INSTANCE但只适用于Struts 1?

我是Java和Hibernate的新手(成为Rails和C#开发人员)。 无论如何,我有一个适用于Hibernate的测试程序,但我的实际Web应用程序(Struts 1)崩溃了:

SEVERE: Servlet.service() for servlet default threw exception java.lang.NoSuchFieldError: INSTANCE

我在用:

Hibernate 3.6.1 with Annotations

Struts 1 with Apache Tiles

C3P0 connection pool

这是实际工作的程序。 这是主要项目的一部分。 只是一个简单的JAVA测试。

 public class TestUser { public static void main(String[] args) { SessionFactory factory = HibernateUtil.getSessionFactory(); Session session = factory.getCurrentSession(); session.beginTransaction(); String queryString = "from User where UserName = 'Quake'"; Query query = session.createQuery(queryString); User quake = (User)query.uniqueResult(); session.getTransaction().commit(); System.out.println( quake.getEmail() ); System.out.println( "Active? " + quake.isActive() ); UserRepository userRepo = new UserRepository(); System.out.println( "User Quake: " + userRepo.findAll().get(0).getEmail() ); } } 

工作得很好。 输出一些样本数据。

现在,当我尝试在Struts中做同样的事情时,我得到了exception。 这是不工作的

 public class ListUsers extends org.apache.struts.action.Action { /* forward name="success" path="" */ private static final String SUCCESS = "success"; /** * This is the action called from the Struts framework. * @param mapping The ActionMapping used to select this instance. * @param form The optional ActionForm bean for this request. * @param request The HTTP Request we are processing. * @param response The HTTP Response we are processing. * @throws java.lang.Exception * @return */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { List listMsg = new ArrayList(); listMsg.add("Message A"); listMsg.add("Message B"); listMsg.add("Message C"); listMsg.add("Message D"); request.setAttribute("listMsg", listMsg); UserRepository userRepo = new UserRepository(); // CRASHES HERE (see HibernateUtil) String email = userRepo.first().getEmail(); return mapping.findForward(SUCCESS); } } 

这是我的HibernateUtil类:

 public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml Configuration config = new Configuration(); // THIS LINE CRASHES IN STRUTS // Add annotated classes config.addAnnotatedClass(User.class); config.configure(); return config.buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed. WTFQNIL: " + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 

HibernateUtilConfiguration config = new Configuration()行是在Struts中而不是测试应用程序崩溃的行。

这是完整的exception转储:

 Feb 24, 2011 9:51:58 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.(TypeResolver.java:59) at org.hibernate.cfg.Configuration.(Configuration.java:249) at org.hibernate.cfg.Configuration.(Configuration.java:300) at com.kencogroup.kkms.struts.utilities.HibernateUtil.buildSessionFactory(HibernateUtil.java:22) at com.kencogroup.kkms.struts.utilities.HibernateUtil.(HibernateUtil.java:17) at com.kencogroup.dao.repositories.UserRepository.first(UserRepository.java:33) at com.kencogroup.kkms.struts.actions.ListUsers.execute(ListUsers.java:52) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) at java.lang.Thread.run(Thread.java:662) 

我究竟做错了什么?

谢谢!

看起来你在类路径中有几个版本的Hibernate jar。

删除这两个依赖对我有用。

   org.hibernate hibernate-commons-annotations 3.0.0.ga runtime   org.hibernate hibernate-annotations 3.3.0.ga  

这些是我的hibernate依赖项。

  org.hibernate hibernate-core 3.6.3.Final   org.javassist javassist 3.17.1-GA   asm asm-all 2.2   antlr antlr 2.7.7   org.hibernate hibernate-entitymanager 3.6.3.Final  

@axtavt说的没错。 我知道你已经解决了这个问题,我发表评论,因为它可能对其他人有帮助。

如果您正在使用maven依赖项,请说您已经拥有自己的hibernate依赖项。 然后,另一个依赖项(如org.codehaus.jackson或drools-spring)被添加到pom中。 它可能会导致此错误,因为org.codehaus.jackson和drools-spring对不同版本的hibernate有自己的依赖。 当你添加org.codehaus.jackson或drools-spring解决概率时,排除hibernate。