我需要在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
感谢任何想法。
答案 0 :(得分:1)
简短回答:否
JNDI查找是首选&&这是正确的方法。
您的WAR无法从JAR文件中看到任何内容,因为它不依赖于它。它很可能也会加载另一个类加载器。如果您将JAR添加为依赖项,则可能会起作用。但是,我想您不希望这样,因为您有其他部署,具体取决于该JAR。
答案 1 :(得分:0)
因此经过大量研究后,唯一可行的解决方案是使用单独的类(EJBProducer),它使用CDI @Produces注释并隐藏JNDI查找。然后,您可以在应用程序中使用@Inject。唯一的问题是你要分别为每个bean编写JNDI。这是一个例子: http://pastebin.com/3V3kKgD9
我必须感谢MartinPolák的解决方案。