2016-08-18 79 views
0

我已经在WAR中使用了需要使用EJB 3.1的JAR。 JAR和WAR都分别部署在同一个JBoss(AS 7.1)上。当我在战争中CDI豆的一个注入EJB我得到这个错误:WELD-001408:尝试@从EJB注入EJB到WAR

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查找(从战争)可能让我得到这个bean的实例。是否可以使用@Inject注释从另一个JAR注入EJB?

类的WAR(CDI Bean)的其中@Inject从EJB JAR:

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

EJB类JAR,我正在尝试与本地和远程接口@Inject:

@Stateless 
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal 

感谢您的任何想法。

+0

在JAR和WAR中都有beans.xml吗? – jpkrohling

+0

是的,我有(一个在JAR的META-INF,一个在WAR的WEB-INF)。根据规范,它甚至是可选的。 –

回答

0

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

我必须感谢MartinPolák提供此解决方案。

1

简短的回答:没有

JNDI查找是在这里去到& &正确的方法。

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

+0

谢谢你的回答。我在我的WAR的WEB-INF中放置了“jboss-deployment-structure.xml”中的JAR依赖项。这是不够的?或者还有另一种类型的依赖关系,我可以设置? –

+0

我的意思是简单地向WAR中添加一个Maven''(假设这是你使用的)。另外,两个档案都应该有'beans.xml' - 理论上,你不需要它,但它是确保你的类被选为bean的最简单的方法。至于'jboss-deployment-structure',我不确定它可以在这里帮助,但是再次,我几乎没有使用过这个功能。 – Siliarus