2009-12-30 2 views
3

У меня недавно возникла проблема, в которой мое веб-приложение не запускается должным образом, и трассировка стека не указывает точно, что произошло. Я смог выделить его слушателю событий, который я написал. Всякий раз, когда я пытаюсь активировать его, я получаю очень родовое исключение:Hibernate - Factory Manager

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) 

Теперь у меня была эта проблема в прошлом, и это было вызвано меня пытаются более оптимизировать каждый класс сущностей, делая сеттеров и добытчиками окончательный. Hibernate необходимо настроить проксирование для классов сущностей, чтобы он мог лениться в загрузке, поэтому, если я сделаю финальный сеттер/геттер, он не сможет этого сделать.

Слушатель событий, который я хочу использовать, по существу прослушивает события сохранения и обновления. Когда это происходит, предполагается установить текущую дату в поле, аннотированное соответствующей аннотацией, чтобы пометить поле как требующее установить текущую дату.

Я имею в виду, что это потому, что я бегу новая версия Javassist:

Javassist: Javassist: фляги: 3.11.0.GA: время выполнения

Кто-нибудь, прежде чем запустить в этот вопрос?

Я бегу JBoss Seam 2.2.0.GA на Jetty 7.

persistence.xml (сокращенный вариант)

<?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> 

Когда я использую Javassist 3.4.GA вместо 3.11.GA, я получите эту ошибку.

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

Я думаю, что для этого исключения должна быть причина. Кроме того, вы должны указать конфигурацию JPA – Bozho

ответ

3

Ну, я действительно не получил никаких хороших ответов. В этом конкретном случае, когда у меня была проблема, проблема заключалась в неправильной настройке моих зависимостей. Это один из негативов, когда мои проекты разбиваются настолько, насколько они есть. Я должен обратить пристальное внимание на ту версию, которую я использую в каждом проекте.

В других случаях мне показалось, что у меня возникли проблемы с конфигурацией Lucene. В любом случае, я бы предпочел видеть трассировку стека, чтобы я мог посмотреть на нее, а затем, упс, у меня плохая банка или что-то в этом роде.

Walter

+1

@Walter White Спасибо, что сообщили нам, что произошло (+1) –

4

Мой совет:

Всегда генерировать проект с использованием Seam-ген

Таким образом, вам не придется беспокоиться о библиотеках что ваш проект нуждается.

сообщение является:

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

Вы создали свой EntityManagerFactory?

Если нет, то следующим образом (я полагаю, вы не используете среду JTA. Таким образом, я покажу вам RESOURCE_LOCAL EntityManagerFactory)

/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> 

Обратите внимание при использовании автоматического создания атрибута равно верно, вы не имеете создать создать атрибут @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; 

Ухаживает с помощью именования, EntityManager ссылки должна соответствовать имени атрибута в настойчивостью: управляемое сохранение контекст компонент.

Теперь вы должны определить свой/META-INF/persistence.XML

/META-INF/persistence.xml 

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

Если вы используете источник данных, который может быть получен с помощью JNDI - вы должны настроить в соответствии вашего целевого сервера приложений (TOMCAT, Jetty и т.д.), сделайте следующее

/META-INF/persistence.xml 

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

И если вы хотите установить текущую дату, выполните следующие действия, вместо того, чтобы использовать 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}"/> 

О окончательного ключевого слова, может быть, вы хотите увидеть I get a log message: reflection optimizer disabled

С уважением,

+0

Arthur, спасибо за ваши комментарии. Я не использую Seam-gen, я использую Maven. Я делаю все, что вы упомянули выше, кроме авто-создания. Я не думаю, что это проблема. Проблема возникает при запуске, когда создается фабрика управления сущностями. Как я уже сказал, я работаю над этим веб-приложением уже несколько месяцев и отлично использовал предыдущие версии. Если я раскомментирую своих пользовательских слушателей сущностей, то есть, когда у меня возникла проблема, или когда у меня есть сущности, не настроенные должным образом. В основном я заинтересован в том, чтобы не видеть трассировку стека. – 2009-12-31 03:55:45

+0

Я видел некоторые проблемы с версией Seam 2.2. Из-за этого я предпочитаю задерживать свое обновление. Если возможно, покажите файл persistence.xml. –

+1

Если я использую проект seam-gen, мне не нужно беспокоиться о какой-либо недостающей библиотеке, и я могу использовать SeamTest, который позволяет мне тестировать без развертывания. –