写了一堆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过程有什么区别。
分享到:
相关推荐
- **获取Home Interface**:声明Connection Object并通过其提供的lookup方法获取EJB Home Interface的引用。 - **创建Remote Interface Client**:通过EJB Home Interface创建EJB组件的远程接口客户端,进而开始使用...
EJB2.0引入了本地接口的概念,允许开发者使用本地接口访问EJB组件,提高性能。在这一部分,我们将学习如何使用本地接口实现CMP实体Bean。 **开发EJB2.0的CMP (EJBQL)** EJBQL (Enterprise JavaBeans Query ...
3. **查找EJB3**:客户端代码使用Java的`InitialContext`类来初始化JNDI上下文,并通过`lookup()`方法查找指定JNDI名称的EJB3组件。 4. **获取引用**:查找成功后,客户端将获得一个bean的引用,通常是代理对象。这...
客户端通过JNDI查找EJB Home接口,进而创建或查找EJB实例,最终使用EJB实例完成具体的业务操作。 #### 三、EJB组件类型 EJB组件可以分为以下三种主要类型: 1. **会话Bean(Session Bean)** - **会话Bean**是非...
本文旨在分享在WAS V7上使用EJB 3.0开发和部署应用的一些关键最佳实践,以帮助开发者避免常见问题,提升项目质量和效率。 首先,为了保持代码的模块化和可重用性,建议在创建工程时,将EJB客户端接口和业务对象...
Java EJB简单例子,这是HelloWorldBean的Home接口,它是EJB对象的生成库,无状态会话(将在下一个实例中具体讲解)Bean,这个接口是客户端与EJB对象相互作用的中间途径,通过Client触发调用Bean方法: try { //...
这个"Java EJB模型模拟完整代码.rar"压缩包提供了一个学习EJB模型的实例,它包含了一系列实现特定操作的远程接口、本地Home接口以及各个模块的功能代码。 EJB的核心概念主要包括三个主要组件:Entity Beans(实体...
1. **Home Interface**(家接口):这是客户端用来创建和管理EJB实例的接口。它提供了查找、创建和移除EJB实例的方法。例如,`create()`方法用于实例化EJB,而`remove()`方法则用于销毁实例。 2. **Remote ...
- **EJB 2.0**:需要为每个实体Bean定义一个Home接口,用于创建和查找Bean实例。 - **EJB 3.0**:取消了Home接口的需求,简化了实体Bean的创建和查找过程。 #### 五、其他变化 - **EJB 3.0**:提供了轻量级的支持,...
门面模式,作为一种软件设计模式,是EJB(Enterprise Java Beans)中的一种经典模式,它在企业级应用...总的来说,门面模式是EJB开发中不可或缺的一个工具,它有效地解决了大型企业应用中复杂性管理和接口简化的问题。
EJB2中的对象创建过程通常涉及JNDI查找和工厂方法(如home.create())。EJB3则引入了依赖注入(Dependency Injection,DI)的概念,使用@EJB注解实现对象的自动装配,使得代码更加简洁和松耦合。比如: ```java @...
一个EJB3的例子,原来的例子是Jarek Miszczyk 所作, 他用的是DB2数据库,这台机器上没安,所以就改造一下用在Oracle10g上了,有多对多关系映射,EJB3比hibernate好,我的感觉,而且是正宗名门。 压缩包有三个工程...
TestSessionLocalHome home = (TestSessionLocalHome) ctx.lookup("java:comp/env/ejb/TestSession"); TestSessionLocal bean = home.create(); bean.xxxx(); ``` 而在EJB3.0中,编程模型得到了显著简化。EJB3.0...
在给定的【部分内容】中,首先介绍了实现EJB组件的一般过程,包括编写业务逻辑Bean类、定义远程接口和home接口以及编写ejb-jar.xml部署描述文件。然后,将这些组件和描述文件打包成一个ejb-jar文件,并使用服务器...
项目中用到的定时调用Ejb接口示例。在jboss下通过。需要依赖jbossall-client.jar包
- **无需实现Home接口**:EJB3.0规范下的所有EJB均无需实现Home接口。 - **业务接口**:每个会话Bean必须具有一个业务接口,该接口由会话Bean实现。 - **注解标识**:通过`@Stateless`注解来标识无状态会话Bean。 - ...
<home>元素用于描述EJB组件的Home接口信息,该元素包含了多个子元素,如等。 元素用于描述EJB组件的远程接口信息,该元素包含了多个子元素,如<EJB-CLASS>等。 <EJB-CLASS>元素用于描述EJB组件的实现类信息,例如...
Home接口是用来创建和查找EJB Object 接口; 组件接口是不同类型的EJB要求实现的指定的接口; 比如: 会话Bean, 实现SessionBean, 导致 Bean类依赖容器; 2) 可以使用注释来代替配置文件; 3) 简化访问EJB容器...
首先,需要安装EJB容器如Apusic Application Server,接着定义远程接口和Home接口,编写EJB类,创建部署描述符`ejb-jar.xml`,最后编译、部署并编写客户端调用程序。 通过上述过程,我们可以看到EJB为开发者提供了...
在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...