WAS当中的EJB Home接口的lookup问题

写了一堆CMP,插入数据库的时候各个表之间有很多关系,所以要涉及到各个home接口的查找,查找过程中遇到了如下问题:

[08-7-30 10:29:06:031 CST] 0000006d SystemOut O looking up :java:comp/env/ejb/AggregationEvent
[08-7-30 10:29:06:062 CST] 0000006d BeanMetaData E CNTR0075E: EnterpriseBean 需要的用户提供的类“com.ncut.salab.epc.DAO.EJSCMPAggregationEventHomeBean_825587a2”找不到或装入。
[08-7-30 10:29:06:093 CST] 0000006d EJBContainerI E WSVR0068E: 尝试启动 EnterpriseBean EPCISServerEAR#EPCISServer.jar#AggregationEvent 时由于异常 com.ibm.ejs.container.ContainerException: Failed to initialize BeanMetaData instance; nested exception is:
java.lang.ClassNotFoundException: com.ncut.salab.epc.DAO.EJSCMPAggregationEventHomeBean_33a7da1a
at com.ibm.ejs.container.BeanMetaData.<init>(BeanMetaData.java:1433)
at com.ibm.ws.runtime.component.EJBContainerImpl.createBeanMetaData(EJBContainerImpl.java:1955)
at com.ibm.ws.runtime.component.EJBContainerImpl.createDeferredBeanMetaData(EJBContainerImpl.java:4585)
at com.ibm.ws.runtime.component.EJBContainerImpl.access$000(EJBContainerImpl.java:434)
at com.ibm.ws.runtime.component.EJBContainerImpl$3.run(EJBContainerImpl.java:4384)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
at com.ibm.ws.runtime.component.EJBContainerImpl.initializeDeferredEJB(EJBContainerImpl.java:4381)
at com.ibm.ejs.container.HomeOfHomes.getHome(HomeOfHomes.java:345)
at com.ibm.ejs.container.HomeOfHomes.getHome(HomeOfHomes.java:306)
at com.ibm.ejs.container.EJSContainer.getLocalHome(EJSContainer.java:1176)
at com.ibm.ejs.container.util.LocalInterfaceHomeObjectFactory.getObjectInstance(LocalInterfaceHomeObjectFactory.java:120)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:316)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:896)
at com.ibm.ws.naming.urlbase.UrlContextHelper.processBoundObjectForLookup(UrlContextHelper.java:191)
at com.ibm.ws.naming.urlbase.UrlContextImpl.processBoundObjectForLookup(UrlContextImpl.java:1775)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1280)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1255)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1307)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1548)
at com.ibm.ws.naming.util.IndirectJndiLookupObjectFactory$1.run(IndirectJndiLookupObjectFactory.java:372)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
at com.ibm.ws.naming.util.IndirectJndiLookupObjectFactory.getObjectInstanceExt(IndirectJndiLookupObjectFactory.java:221)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:893)
at com.ibm.ws.naming.urlbase.UrlContextHelper.processBoundObjectForLookup(UrlContextHelper.java:191)
at com.ibm.ws.naming.java.javaURLContextRoot.processBoundObjectForLookup(javaURLContextRoot.java:403)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1280)
at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:384)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:201)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:142)
at javax.naming.InitialContext.lookup(InitialContext.java:363)
at com.ncut.salab.epc.EPCRepository.RepositoryBean.lookup(RepositoryBean.java:213)
at com.ncut.salab.epc.EPCRepository.RepositoryBean.capture(RepositoryBean.java:133)
at com.ncut.salab.epc.EPCRepository.EJSLocalStatelessRepository_85747c29.capture(EJSLocalStatelessRepository_85747c29.java:29)
at com.ncut.salab.epc.CaptureImp.CaptureEventBean.onMessage(CaptureEventBean.java:81)
at com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:992)
at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:725)
at $Proxy8.onMessage(Unknown Source)
at com.ibm.ws.sib.api.jmsra.impl.JmsJcaEndpointInvokerImpl.invokeEndpoint(JmsJcaEndpointInvokerImpl.java:201)
at com.ibm.ws.sib.ra.inbound.impl.SibRaDispatcher.dispatch(SibRaDispatcher.java:708)
at com.ibm.ws.sib.ra.inbound.impl.SibRaSingleProcessListener$SibRaWork.run(SibRaSingleProcessListener.java:584)
at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:497)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1498)
Caused by: java.lang.ClassNotFoundException: com.ncut.salab.epc.DAO.EJSCMPAggregationEventHomeBean_33a7da1a
at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:472)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:373)
at java.lang.ClassLoader.loadClass(ClassLoader.java:561)
at com.ibm.ejs.container.BeanMetaData.loadExistedClass(BeanMetaData.java:3763)
at com.ibm.ejs.container.BeanMetaData.<init>(BeanMetaData.java:1329)
... 41 more

貌似是WAS在初始化一个EJB的时候出了问题,有个类找不到,我去workspace里查看了下,“EJSCMPAggregationEventHomeBean_825587a2.class”并没有问题,在developer works上看了一个帖子,有类似的问题,有人说是classloader的问题,但我想不通为什么,因为所有的SessionBean和CMPbean目前都在一个EAR包里面,没有理由加载SessionBean的时候不去加载CMP的class,奇怪。

找到一个可能的原因:

我在写代码的时候为了图省事,把多个EJB的查找写在一个方法里面,大概就是这样:

private EJBLocalHome lookup(String tableName) {
Context icxt = null;
EJBLocalHome home = null;
try {
icxt = new InitialContext();
System.out.println("looking up :" + "java:comp/env/ejb/" + tableName);
home = (EJBLocalHome) icxt.lookup("java:comp/env/ejb/" + tableName);
System.out.println("Find ejb local home interface with this JNDI name :  java:comp/env/ejb/" +tableName);
return home;
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return home;
}

在另一个方法里面拿到这个方法的返回值之后再去做强制类型转换,转换成相应的home接口,然后再create。但这样好像不行,原因还不清楚.

 

可能真的是classloader的原因,我把这个工程打成一个EAR包来发布而不用RAD集成的功能来发布,问题就解决了。但目前还不清楚WAS对于这两种发布方式的classload过程有什么区别。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值