WELD-001408:尝试从JAR到WAR的@Inject EJB

时间:2016-08-18 15:00:48

标签: java-ee jboss ejb cdi inject

我需要在WAR中使用EJB 3.1的JAR。 JAR和WAR都在相同的JBoss(AS 7.1)上单独部署。当我在WAR中的一个CDI bean中注入EJB时,我遇到了这个错误:

16:45:19,003 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.unit."TEST_WEB.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."TEST_WEB.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [TestSessionEJBLocal] with qualifiers [@Default] at injection point [[field] @Inject cz.pfreiberg.test.view.portlet.ViewPortlet.testBean]
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:83)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79]
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [TestSessionEJBLocal] with qualifiers [@Default] at injection point [[field] @Inject cz.pfreiberg.test.view.portlet.ViewPortlet.testBean]
        at     org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275)
        at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
        at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
        at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
        at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
        at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
        at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
        at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
        at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)

从我目前的观点来看,@ Inject没有看到EJB,但是如果我使用手动JNDI查找(来自WAR),我可以获得这个bean的实例。是否可以使用@Inject批注从另一个JAR注入EJB?

WAR中的类(CDI Bean),来自JAR的@Inject EJB:

@Model
public class ViewPortlet implements Serializable {
     @Inject
     TestSessionEJBLocal testBean;
}

JAR中的EJB类,我正在尝试使用本地和远程接口@Inject:

@Stateless
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal

感谢任何想法。

2 个答案:

答案 0 :(得分:1)

简短回答:

JNDI查找是首选&&这是正确的方法。

您的WAR无法从JAR文件中看到任何内容,因为它不依赖于它。它很可能也会加载另一个类加载器。如果您将JAR添加为依赖项,则可能会起作用。但是,我想您不希望这样,因为您有其他部署,具体取决于该JAR。

答案 1 :(得分:0)

因此经过大量研究后,唯一可行的解​​决方案是使用单独的类(EJBProducer),它使用CDI @Produces注释并隐藏JNDI查找。然后,您可以在应用程序中使用@Inject。唯一的问题是你要分别为每个bean编写JNDI。这是一个例子: http://pastebin.com/3V3kKgD9

我必须感谢MartinPolák的解决方案。