Jakarta ee 可以从不同的应用程序/EAR注入EJB吗?
我正在完成一个将在其他一些项目中使用的EJB服务,因此我需要将它注入到一些ManagedBeans、其他EJB甚至Servlet中 我们已经有一些应用程序依赖项,但它始终是单个依赖项,因此我们习惯于以这种方式部署:Jakarta ee 可以从不同的应用程序/EAR注入EJB吗?,jakarta-ee,ejb,Jakarta Ee,Ejb,我正在完成一个将在其他一些项目中使用的EJB服务,因此我需要将它注入到一些ManagedBeans、其他EJB甚至Servlet中 我们已经有一些应用程序依赖项,但它始终是单个依赖项,因此我们习惯于以这种方式部署: App1Ear | libs | AppXModel.jar AppXEJB.jar | App1Model.jar App1EJB.jar App1Web.war | 我正在使用的项目将在4个应用程序中使用,因此如果我们遵循此模型,我们将按如下方式部署应
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的研究,但我发现的大部分结果都是关于注入来自不同应用程序但在同一个.EAR中的EJB,而且我尝试的测试根本不起作用
我试图以这种方式注入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
以及界面:
import javax.ejb.Remote;
@Remote
public interface RemoteInterface {
public void doSomething(BusinessVO businessVO);
}
jdni名称看起来不错。它实际上找到了SessionBean,但无法创建对它的远程引用。因为它找不到BusinessImpl(它甚至不应该知道类是相关的)。BusinessImpl和接口的代码是什么?我假设MyNewService应用程序启动时没有出现问题?.Thx请注意,我使用interface/impl代码编辑了原始帖子,因为现在它只有一种方法,因为服务正在开发中。您是否尝试过另一种方法,即使用
@Remote(InterfaceName.class)
标记bean?jdni名称看起来不错。它实际上找到了SessionBean,但无法创建对它的远程引用。因为它找不到BusinessImpl(它甚至不应该知道类是相关的)。BusinessImpl和接口的代码是什么?我假设MyNewService应用程序启动时没有出现问题?。请注意,我使用interface/impl代码编辑了原始帖子,因为现在它只有一种方法,因为服务正在开发中。您是否尝试过另一种方法,即使用@Remote(InterfaceName.class)
标记bean?
import javax.ejb.Remote;
@Remote
public interface RemoteInterface {
public void doSomething(BusinessVO businessVO);
}