是否可以从不同的应用程序/ EAR中注入EJB?

时间:2016-06-24 19:13:31

标签: java-ee ejb

我正在完成将在其他一些项目中使用的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);
}

0 个答案:

没有答案