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!
Il semble que vous ayez plusieurs versions des fichiers jar Hibernate dans le classpath.
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>
@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.