2009-12-30 6 views
3

J'ai récemment rencontré un problème dans lequel mon application Web ne démarre pas correctement et la trace de la pile n'indique pas exactement ce qui s'est passé. J'ai été capable de l'isoler à un écouteur d'événements que j'ai écrit. Chaque fois que je tente de l'activer, je reçois une exception très générique:Hibernate - Entity Manager Factory

org.jboss.seam.InstantiationException: Could not instantiate Seam component: entityManagerFactory 
    at org.jboss.seam.Component.newInstance(Component.java:2144) 
    at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304) 
    at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278) 
    at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:116) 
    at org.jboss.seam.init.Initialization.init(Initialization.java:740) 
    at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36) 
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:645) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:189) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:978) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:586) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:349) 
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:102) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:165) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:162) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:165) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:92) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:228) 
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:69) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:433) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:377) 
    at org.mortbay.jetty.plugin.JettyRunWarMojo.execute(JettyRunWarMojo.java:68) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 

Maintenant, j'ai eu ce problème dans le passé, et qui a été causé par moi d'essayer de plus optimiser chaque classe d'entité en faisant les setters et getters final. Hibernate doit paramétrer le proxying pour les classes d'entités afin qu'il puisse charger des choses paresseuses, donc si je fais un setter/getter final, il ne peut pas le faire.

L'écouteur d'événement que je veux utiliser écoute essentiellement les événements de persistance et de mise à jour. Quand un événement se produit, il est supposé définir la date actuelle sur un champ annoté avec l'annotation correspondante pour marquer le champ comme nécessitant une date actuelle à définir.

Je pense que cela est parce que je me présente une version plus récente de javassist:

javassist: javassist: pot: 3.11.0.GA: exécution

Quelqu'un at-il rencontré ce problème avant?

Je suis en cours d'exécution JBoss Seam 2.2.0.GA sur la jetée 7.

persistence.xml (version abrégée)

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 
    <persistence-unit name="${jdbc.database}" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <non-jta-data-source>${jdbc.datasource.name}</non-jta-data-source> 

     <class> ... classes go here </class> 

     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.dialect" value="${hibernate.dialect}"/> 
      <property name="hibernate.hbm2ddl.auto" value="${ddl.mode}"/> 

      <property name="hibernate.show_sql" value="${hibernate.showSql}"/> 
      <property name="format_sql" value="${hibernate.formatSql}"/> 
      <property name="use_sql_comments" value="${hibernate.useSqlComments}"/> 

      <property name="hibernate.jdbc.batch_versioned_data" value="true"/> 

      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EHCacheProvider"/> 

      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> 
      <property name="hibernate.cache.use_query_cache" value="true"/> 
      <property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml"/> 

      <property name="hibernate.connection.release_mode" value="after_transaction"/> 
      <property name="hibernate.connection.autocommit" value="true"/> 

      <!-- Current Date listeners --> 
      <!-- 
      <property name="hibernate.ejb.event.pre-insert" value="org.hibernate.ejb.event.EJB3PersistEventListener,com.walterjwhite.listener.persistence.listener.SetCurrentDateListener"/> 
      <property name="hibernate.ejb.event.pre-update" value="org.hibernate.ejb.event.EJB3MergeEventListener,com.walterjwhite.listener.persistence.listener.SetCurrentDateListener"/> 
      --> 

      <!-- Envers listeners --> 
      <property name="hibernate.ejb.event.post-insert" value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener"/> 
      <property name="hibernate.ejb.event.post-update" value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener"/> 
      <property name="hibernate.ejb.event.post-delete" value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener"/> 
      <property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener"/> 
      <property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener"/> 
      <property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener"/> 

      <!-- Hibernate Search --> 
      <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/> 
      <property name="hibernate.search.default.indexBase" value="${application.directory}/lucene/indexes"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Lorsque j'utilise Javassist 3.4.GA au lieu de 3.11.GA, je obtenir cette erreur.

java.lang.IllegalAccessError: tried to access class javassist.bytecode.StackMapTable$Writer from class org.jboss.seam.util.ProxyFactory 
    at org.jboss.seam.util.ProxyFactory.makeConstructor(ProxyFactory.java:803) 
    at org.jboss.seam.util.ProxyFactory.makeConstructors(ProxyFactory.java:685) 
    at org.jboss.seam.util.ProxyFactory.make(ProxyFactory.java:565) 
    at org.jboss.seam.util.ProxyFactory.createClass3(ProxyFactory.java:346) 
    at org.jboss.seam.util.ProxyFactory.createClass2(ProxyFactory.java:325) 
    at org.jboss.seam.util.ProxyFactory.createClass(ProxyFactory.java:284) 
    at org.jboss.seam.Component.createProxyFactory(Component.java:2426) 
    at org.jboss.seam.Component.getProxyFactory(Component.java:1513) 
    at org.jboss.seam.Component.wrap(Component.java:1504) 
    at org.jboss.seam.Component.instantiateJavaBean(Component.java:1442) 
    at org.jboss.seam.Component.instantiate(Component.java:1359) 
    at org.jboss.seam.Component.newInstance(Component.java:2122) 
    at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304) 
    at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278) 
    at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:116) 
    at org.jboss.seam.init.Initialization.init(Initialization.java:740) 
    at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36) 
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:645) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:189) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:978) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:586) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:349) 
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:102) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:165) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:162) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:165) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:92) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:228) 
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:69) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:433) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:377) 
    at org.mortbay.jetty.plugin.JettyRunWarMojo.execute(JettyRunWarMojo.java:68) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 

Walter

+0

Je pense qu'il devrait y avoir une cause première pour cette exception. En outre, vous devez fournir votre configuration JPA – Bozho

Répondre

3

Eh bien, je n'ai pas vraiment eu de bonnes réponses. Dans ce cas particulier que j'ai rencontré le problème, le problème était de configurer une version incorrecte de mes dépendances. C'est l'un des points négatifs de voir mes projets divisés autant qu'ils le sont. Je dois porter une attention particulière à la version que j'utilise dans chaque projet.

Dans d'autres cas, il m'a semblé que j'avais des problèmes avec une configuration Lucene. Dans les deux cas, je préférerais voir la trace de la pile pour que je puisse la regarder et puis, oups, j'ai un mauvais pot ou quelque chose comme ça.

Walter

+1

@Walter White Merci de nous avoir dit ce qui s'est passé (+1) –

4

Mon conseil est:

toujours générer votre projet en utilisant seam-gen

De cette façon, vous n'avez pas à vous soucier de bibliothèques que votre projet a besoin.

message est:

org.jboss.seam.InstantiationException: Could not instantiate Seam component: entityManagerFactory 

Avez-vous mis en place votre EntityManagerFactory?

Sinon, procédez comme suit (je suppose que vous n'utilisez pas l'environnement JTA. Donc, je vais vous montrer un EntityManagerFactory RESOURCE_LOCAL)

/WEB-INF/components.xml 

<!--I AM USING 2.1 version--> 
<!--SO I SUPPOSE YOU HAVE TO REPLACE 2.1 by 2.2--> 
<components xmlns="http://jboss.com/products/seam/components" 
     xmlns:core="http://jboss.com/products/seam/core" 
     xmlns:persistence="http://jboss.com/products/seam/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation= 
      "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd 
      http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd 
      http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd"> 

<!--SET UP A MANAGED EntityManagerFactory--> 
<!--DEFAULT TO ScopeType.APPLICATION--> 
<persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="<PERSISTENCE_UNIT_NAME_MUST_MATCH_NAME_ATTRIBUTE_IN_PERSISTENCE.XML>"/> 

<!--SET UP A MANAGED EntityManager--> 
<!--DEFAULT TO ScopeType.CONVERSATION--> 
<persistence:managed-persistence-context name="entityManager" entity-manager-factory="#{entityManagerFactory}" auto-create="true"/> 

<!--SET UP SEAM TRANSACTION MANAGER--> 
<!--IT TAKES CARE OF CALLING BEGIN AND COMMIT--> 
<tx:entity-transaction entity-manager="#{entityManager}"/> 

</components> 

avis lors de l'utilisation d'auto-créer l'attribut égal vrai, vous n'avez pas de mettre en place créer attribut dans l'annotation @In

// You do not need to set up create attribute 
// because of auto-create atrribute in persistence:managed-persistence-context component 
@In(create=true) 
private EntityManager entityManager; 

prend en charge en utilisant la convention de dénomination, référence EntityManager doit correspondre attribut name dans la persistance: composante gérée par la persistance du contexte.

Maintenant, vous devez définir votre/META-INF/persistance.xml

/META-INF/persistence.xml 

<persistence-unit name="<PERSISTENCE_UNIT_NAME_GOES_HERE>" transaction-type="RESOURCE_LOCAL"> 
    // Set up properties here 
</persistence-unit> 

Si vous utilisez une source de données qui peuvent être obtenus par JNDI - vous devez configurer selon votre serveur d'applications cible (TOMCAT, JETTY etc.), procédez comme suit

/META-INF/persistence.xml 

<persistence-unit name="<PERSISTENCE_UNIT_NAME_GOES_HERE>"> 
    <non-jta-data-source>jdbc/myAppDS</non-jta-data-source> 
</persistence-unit> 

Et si vous voulez mettre en place une date, procédez comme suit au lieu d'utiliser l'événement Hibernate

<!--currentDate IS A BUILT-IN Seam component--> 
<!--DEFAULT TO ScopeType.STATELESS--> 
<!--ScopeType.STATELESS IS SIMILAR TO Spring prototype scope--> 
<h:inputHidden value="#{currentDate}" rendered="false" binding="#{myBackingBean.currentDate}"/> 

a propos de mot-clé finale, peut-être que vous voulez voir I get a log message: reflection optimizer disabled

salutations,

+0

Arthur, merci pour vos commentaires. Je n'utilise pas Seam-gen, j'utilise Maven. Je fais tout ce que vous avez mentionné ci-dessus, sauf l'auto-créer. Je ne crois pas que ce soit le problème. Le problème se produit au démarrage lors de la création de la fabrique du gestionnaire d'entités. Comme je l'ai dit, je travaille sur cette application web depuis des mois et j'ai très bien déployé les versions précédentes. Si je décommente mes écouteurs d'entité personnalisée, c'est à ce moment-là que j'obtiens le problème ou lorsque des entités ne sont pas configurées correctement. Je suis surtout préoccupé de ne pas voir la trace de la pile. –

+0

J'ai vu quelques problèmes à propos de la version Seam 2.2. Pour cette raison, je préfère retarder ma mise à jour. Si possible, affichez votre fichier persistence.xml. –

+1

Si j'utilise un projet seam-gen, je n'ai pas à me soucier de la bibliothèque manquante et je peux utiliser SeamTest qui me permet de tester sans déployer. –