我正在完成将在其他一些项目中使用的EJB服务,因此我需要将它注入一些ManagedBeans,其他EJB甚至是Servlet。
我们已经有一些应用程序依赖,但它始终是单依赖项,因此我们习惯于以这种方式部署:
App1Ear
|
libs
|
AppXModel.jar
AppXEJB.jar
|
App1Model.jar
App1EJB.jar
App1Web.war
|
我正在使用的项目将在4个应用程序中使用,因此如果我们遵循此模型,我们将部署应用程序:
App1Ear
|
libs
|
MyNewServiceJB.jar
|
App2Ear
|
libs
|
MyNewServiceJB.jar
|
App3Ear
|
libs
|
MyNewServiceJB.jar
|
等等......
所以我开始考虑是否更好 - 如果可能的话 - 在.EAR中“独立”部署新的EJB应用程序并将其远程注入到其他应用程序中,这样我们就不会有很多内容在服务器中运行的同样的东西 - 顺便说一下WebSphere Application Server 8.0。
我的意思是成功:
MyNewService.EAR
|
MyNewServiceEJB.jar
|
我已经开始研究注入远程EJB了,但是我发现的结果主要是关于从不同的应用程序注入EJB,但是在同一个.EAR中,我试过的测试根本不起作用!
我试图以这种方式注入Servlet
@EJB(lookup="java:global/MyNewServiceEAR/MyNewServiceEJB/BusinessImpl!com.bla.bla.bla.RemoteInterface")
RemoteInterface remoteService;
上面的这个JNDI是在部署期间从控制台获得的,所以我敢打赌它没有任何问题。
我得到了什么:
Caused by: com.ibm.wsspi.injectionengine.InjectionConfigurationException: Failed to process xml from Deployment Descriptor
at com.ibm.ws.injectionengine.AbstractInjectionEngine.processXML(AbstractInjectionEngine.java:746)
at com.ibm.ws.injectionengine.AbstractInjectionEngine.processInjectionMetaData(AbstractInjectionEngine.java:456)
at com.ibm.ws.injectionengine.AbstractInjectionEngine.processInjectionMetaData(AbstractInjectionEngine.java:379)
at com.ibm.ws.injectionengine.ReferenceContextImpl.process(ReferenceContextImpl.java:965)
... 82 more
Caused by: com.ibm.wsspi.injectionengine.InjectionConfigurationException: The com.app.service.BusinessImpl interface specified for <ejb-ref> or <ejb-local-ref> could not be found
at com.ibm.ws.injectionengine.processor.EJBInjectionBinding.loadClass(EJBInjectionBinding.java:1379)
at com.ibm.ws.injectionengine.processor.EJBInjectionBinding.getEJBInjectionType(EJBInjectionBinding.java:1161)
at com.ibm.ws.injectionengine.processor.EJBProcessor.processXML(EJBProcessor.java:200)
at com.ibm.ws.injectionengine.AbstractInjectionEngine.processXML(AbstractInjectionEngine.java:736)
... 85 more
Caused by: java.lang.ClassNotFoundException: com.app.service.BusinessImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:434)
at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:240)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:701)
at java.lang.ClassLoader.loadClass(ClassLoader.java:680)
at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:133)
at java.lang.ClassLoader.loadClass(ClassLoader.java:663)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:599)
at java.lang.ClassLoader.loadClass(ClassLoader.java:663)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:567)
at java.lang.ClassLoader.loadClass(ClassLoader.java:663)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:567)
at java.lang.ClassLoader.loadClass(ClassLoader.java:663)
at com.ibm.ws.injectionengine.processor.EJBInjectionBinding.loadClass(EJBInjectionBinding.java:1363)
... 88 more
这可能吗???如果是的话,怎么样?我错过了什么?
THX
-------------使用接口和实现代码编辑------
import javax.ejb.Stateless;
@Stateless
public class BusinessImpl implements RemoteInterface {
public void doSomething(BusinessVO businessVO) throws BusinessException{
...business implenetation
}
}
界面:
import javax.ejb.Remote;
@Remote
public interface RemoteInterface {
public void doSomething(BusinessVO businessVO);
}