2016-08-18 3 views
0

WAR에서 사용해야하는 EJB 3.1과 JAR을했습니다. JAR과 WAR는 모두 동일한 JBoss (AS 7.1)에 별도로 배포됩니다. 내가 전쟁에서 CDI 콩 중 하나에 EJB를 주입 할 때이 오류가있어 :WELD-001408 : JAR에서 WAR로 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 룩업을 사용하는 경우)이 bean의 인스턴스를 얻을 수있다. @Inject 어노테이션으로 다른 JAR에서 EJB를 주입 할 수 있습니까? WAR에서

클래스 (CDI 콩) JAR에서 어떤 @Inject EJB : 나는 로컬 및 원격 인터페이스 @Inject하기 위해 노력하고있어 JAR에서

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

EJB 클래스 :

@Stateless 
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal 

어떤 아이디어 주셔서 감사합니다.

+0

JAR과 WAR 모두에 beans.xml이 있습니까? – jpkrohling

+0

예, 가지고 있습니다 (JAR 용 META-INF에 하나, WAR 용 WEB-INF에 하나). 사양에 따르면 선택 사항입니다. –

답변

0

그래서 많은 연구가 끝나면 유일한 대안은 CDP @Produces 주석을 사용하고 JNDI 조회를 숨기는 별도의 클래스 (EJBProducer)를 사용하는 것입니다. 그런 다음 응용 프로그램 내에서 @Inject를 사용할 수 있습니다. 유일한 문제는 각 bean마다 JNDI를 별도로 작성해야한다는 것입니다. 예를 들면 다음과 같습니다. http://pastebin.com/3V3kKgD9

이 솔루션은 Martin Polák에게 감사드립니다.

1

짧은 답변 :

JNDI 룩업 여기 & & 이동-에 올바른 방법입니다.

WAR는 JAR 파일에 의존하지 않으므로 JAR 파일에서 아무 것도 볼 수 없습니다. 대부분 다른 클래스 로더로로드 될 가능성이 높습니다. JAR을 종속성으로 추가하면 작동 할 수 있습니다. 그러나 JAR에 따라 다른 배포가있을 때 그렇게하지 않으려한다고 가정합니다.

+0

답변 해 주셔서 감사합니다. 나는 WAR의 WEB-INF에있는 "jboss-deployment-structure.xml"에서 JAR에 의존했다. 이것으로 충분하지 않습니까? 아니면 내가 설정할 수있는 또 다른 유형의 종속성이 있습니까? –

+0

나는 단순히 Maven''(당신이 사용하는 것으로 가정)을 WAR에 추가하는 것을 의미했습니다. 게다가 두 개의 아카이브 모두'beans.xml'을 가져야합니다. 이론적으로는 필요 없습니다.하지만 클래스를 빈으로 선택하는 것이 가장 쉬운 방법입니다. 'jboss-deployment-structure'에 관해서는 여기서 도움이 될지 모르겠지만 다시는 거의 사용하지 않았습니다. – Siliarus