在EJB mdb中初始化Hibernate SessionFactory?

时间:2013-08-05 17:19:29

标签: java hibernate ejb

我正在尝试在WAS 8.5中部署MDB。会话工厂正在ejbCreate方法中初始化。当我尝试部署应用程序ejb成功加载然后它关闭队列激活并给出以下例外 - 我没有使用任何框架或MAven来构建,因此所有的jar和配置文件都已添加到类路径中,就像在独立Java应用程序中一样。

以下是我正在使用的Hibernate和JAVAEE Jars-

antlr-2.7.7
c3p0-0.9.1
commons-collections-3.2.1
commons-logging-api-1.1.3
dom4j-1.6.1
hibernate-c3p0-4.1.5.Final
hibernate-commons-annotations-4.0.1.Final
hibernate-core-4.1.5.Final
hibernate-entitymanager-4.1.5.Final
hibernate-envers-4.1.5.Final
hibernate-jpa-2.0-api-1.0.1.Final
javassist-3.15.0GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final
jms-1.1
log4j-1.2.15
MySQL-connector-java-5.1.22
slf4j-api-1.6.1
javaee.jar
javaee-api-6.0

以下是来自系统日志的异常堆栈跟踪

EJB threw an unexpected (non-declared) exception during invocation of  method "onMessage".Exception data: 
          javax.ejb.EJBException: MDB PostConstruct failure; nested exception is: 
          java.lang.Exception: See nested Throwable
    at com.ibm.ejs.container.util.ExceptionUtil.EJBException(ExceptionUtil.java:472)
    at com.ibm.ejs.container.MessageDrivenBeanO.initialize(MessageDrivenBeanO.java:427)
    at com.ibm.ejs.container.BeanOFactory.create(BeanOFactory.java:147)
    at com.ibm.ejs.container.EJSHome.createBeanO(EJSHome.java:1238)
    at com.ibm.ejs.container.EJSHome.createBeanO(EJSHome.java:1356)
    at com.ibm.ejs.container.activator.UncachedActivationStrategy.atActivate 
          (UncachedActivationStrategy.java:88)
    at com.ibm.ejs.container.activator.Activator.preInvokeActivateBean(Activator.java:615)
    at com.ibm.ejs.container.EJSContainer.preInvokeActivate(EJSContainer.java:4205)
    at com.ibm.ejs.container.EJSContainer.preInvokeMdbActivate(EJSContainer.java:3709)
    at com.ibm.ejs.container.MessageEndpointHandler.beforeDelivery
          (MessageEndpointHandler.java:1449)
    at com.ibm.ejs.container.MessageEndpointHandler.invokeMessageEndpointMethod
          (MessageEndpointHandler.java:866)
    at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:832)
    at $Proxy50.beforeDelivery(Unknown Source)
    at com.ibm.mq.connector.inbound.AbstractWorkImpl.run(AbstractWorkImpl.java:188)
    at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:608)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1783)
          Caused by: java.lang.Exception: See nested Throwable
    at com.ibm.ejs.container.util.ExceptionUtil.EJBException(ExceptionUtil.java:470)
    ... 15 more
          Caused by: java.lang.NoClassDefFoundError: org.hibernate.HibernateException
    at java.lang.J9VMInternals.verifyImpl(Native Method)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:85)
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:162)
    at com.hps.superenrollment.ejbmodule.SuperEnrollmentRequestMDB.ejbCreate
          (SuperEnrollmentRequestMDB.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor
          (InterceptorProxy.java:232)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed
          (InvocationContextImpl.java:559)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.doLifeCycle  
          (InvocationContextImpl.java:273)
    at com.ibm.ejs.container.MessageDrivenBeanO.initialize(MessageDrivenBeanO.java:411)

请帮助我,因为我完全迷失在这里出了什么问题。

1 个答案:

答案 0 :(得分:1)

NoClassDefFoundError表示某些Hibernate类不在您的类路径中。您确定在类路径中有所有依赖项jar(包括运行时需要的jar)吗?

指示您应该使用PostConstructor方法而不是bean类构造函数的异常表示您应该使用ejbCreate()方法。这是初始化和加载MDB依赖关系的推荐位置,因为它由ejb容器的单个线程调用,并确保在执行ejbCreate()中的配置之前已完全构造MDB。它有点类似于servlet中的init方法,它也保证被servlet容器称为单线程。