2016-08-18 4 views
0

У меня JAR с EJB 3.1, который мне нужно использовать в WAR. И JAR, и WAR развертываются отдельно на одном JBoss (AS 7.1). Когда я впрыснуть EJB в одном из бобов CDI в WAR я получил эту ошибку:WELD-001408: try @Inject EJB от JAR до 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 поиск (с WAR), я могу получить экземпляр этого компонента. Можно ли добавить EJB из другого JAR с помощью аннотации @Inject?

класса в WAR (CDI Bean), который @Inject EJB из ЕАО: класс

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

EJB в JAR, который я пытаюсь @Inject с локальным и удаленным интерфейсом:

@Stateless 
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal 

Спасибо за любые идеи.

+0

У вас есть beans.xml как в JAR, так и в WAR? – jpkrohling

+0

Да, у меня (один в META-INF для JAR, один в WEB-INF для WAR). Согласно спецификации, это даже необязательно. –

ответ

0

Таким образом, после многих исследований, вероятно, единственным жизнеспособным решением является использование отдельного класса (EJBProducer), который использует аннотацию CDI @Produces и скрывает поиск JNDI. Затем вы можете использовать @Inject внутри своего приложения. Единственная проблема заключается в том, что вы должны писать JNDI для каждого компонента отдельно. Вот пример: http://pastebin.com/3V3kKgD9

Я должен поблагодарить Мартина Полака за это решение.

1

Короткий ответ: нет

JNDI поиск не идти к & & правильный путь здесь.

Ваша WAR не может ничего видеть из файла JAR, так как она не зависит от него. Скорее всего, он будет загружен другим загрузчиком классов. Если вы добавили JAR в зависимость, это может сработать. Однако, я полагаю, вы не хотите идти таким путем, поскольку у вас есть другое развертывание (ы) в зависимости от этого JAR.

+0

Благодарим вас за ответ. Я имею зависимость от JAR в «jboss-deployment-structure.xml», который лежит в WEB-INF моей WAR. Этого недостаточно? Или есть другой тип зависимости, который я могу установить? –

+0

Я имел в виду просто добавить Maven '' (предполагая, что это то, что вы используете) для вашей WAR. Плюс оба архива должны иметь «beans.xml» - теоретически, вам это не нужно, но это самый простой способ убедиться, что ваши классы выбраны как бобы. Что касается 'jboss-deployment-structure', я не уверен, что это может помочь здесь, но опять-таки, я почти никогда не использовал эту функцию. – Siliarus

Смежные вопросы