web-dev-qa-db-fra.com

Hibernate NoSuchFieldError INSTANCE mais uniquement avec Struts 1?

Je suis nouveau dans Java et Hibernate (développeur Rails et C #). Quoi qu'il en soit, j'ai un programme de test qui fonctionne bien avec Hibernate, mais mon application Web (Struts 1) se bloque avec:

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

J'utilise:

Hibernate 3.6.1 with Annotations

Struts 1 with Apache Tiles

C3P0 connection pool

Voici le programme qui réellementFONCTIONNE. Cela fait partie du projet principal. Juste un simple test 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() );

  }
}

Fonctionne très bien. Affiche un petit échantillon de données.

Maintenant, quand j'essaie de faire la même chose dans Struts, j'ai l'exception. C’est ce que fait NOT WORK :

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<String> listMsg = new ArrayList<String>();

    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);
  }
}

Ceci est ma classe 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;
  }
}

La ligne Configuration config = new Configuration() dans la HibernateUtil est la ligne qui se bloque dans Struts mais pas dans l'application de test.

Voici le dump d'exception complet:

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.<init>(BasicTypeRegistry.Java:94)
at org.hibernate.type.TypeResolver.<init>(TypeResolver.Java:59)
at org.hibernate.cfg.Configuration.<init>(Configuration.Java:249)
at org.hibernate.cfg.Configuration.<init>(Configuration.Java:300)
at com.kencogroup.kkms.struts.utilities.HibernateUtil.buildSessionFactory(HibernateUtil.Java:22)
at com.kencogroup.kkms.struts.utilities.HibernateUtil.<clinit>(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)

Qu'est-ce que je fais mal?

Merci!

18
cbmeeks

Il semble que vous ayez plusieurs versions des fichiers jar Hibernate dans le classpath.

21
axtavt

Supprimer ces deux dépendances a fonctionné pour moi.  

   <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.0.0.ga</version>
        <scope>runtime</scope>
    </dependency>
     <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency> 

Ce sont mes dépendances d'hibernation.  

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.3.Final</version>
</dependency>
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.17.1-GA</version>
</dependency>
<dependency>
    <groupId>asm</groupId>
    <artifactId>asm-all</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>antlr</groupId>
    <artifactId>antlr</artifactId>
    <version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.6.3.Final</version>
</dependency>
1
Seeker

@axtavt dit que c'est vrai. Je sais que vous avez déjà résolu le problème, je poste mes commentaires, car cela pourrait aider d'autres personnes. 

Si vous utilisez des dépendances maven, dites que vous avez déjà votre propre dépendance hibernate. Et plus tard, une autre dépendance (comme org.codehaus.jackson ou drools-spring) est ajoutée au pom. Cela pourrait provoquer cette erreur car org.codehaus.jackson et drools-spring ont leur propre dépendance sur une version différente en veille prolongée. exclure l'hibernation lorsque vous ajoutez org.codehaus.jackson ou drools-spring résoudrait le problème.

0
Shasha.Zhu