WELD-001408:尝试将 JAR 中的 @Inject EJB 注入 WAR

WELD-001408: trying @Inject EJB from JAR to WAR

我需要在 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?

Class 在 WAR (CDI Bean) 中 @Inject EJB from JAR:

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

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

@Stateless
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal

感谢任何想法。

简答:

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

您的 WAR 无法从 JAR 文件中看到任何内容,因为它不依赖于它。它很可能还会加载另一个 class 加载程序。如果您将 JAR 添加为依赖项,它可能会起作用。但是,我想您不想那样做,因为您有其他部署取决于该 JAR。

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

我必须感谢 Martin Polák 提供的这个解决方案。