2016-08-18 4 views
0

J'ai un JAR avec EJB 3.1 que j'ai besoin d'utiliser dans WAR. JAR et WAR sont déployés séparément sur le même JBoss (AS 7.1). Lorsque j'injecte EJB dans l'un des haricots CDI dans WAR je suis arrivé cette erreur:WELD-001408: try @Inject EJB de 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) 

De mon point de vue actuel de la @Inject ne voit pas l'EJB, mais si j'utiliser la recherche manuelle JNDI (de la guerre) est possible pour moi d'obtenir l'instance de ce haricot. Est-il possible d'injecter un EJB à partir d'un autre JAR avec l'annotation @Inject?

classe WAR (CDI Bean) qui @Inject EJB du JAR:

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

classe EJB JAR que je suis en train de @Inject avec interface locale et à distance:

@Stateless 
public class TestSessionEJBBean implements TestSessionEJB, TestSessionEJBLocal 

Merci pour vos idées.

+0

Avez-vous un beans.xml dans votre JAR et votre WAR? – jpkrohling

+0

Oui, j'ai (un à META-INF pour JAR, un à WEB-INF pour WAR). Selon la spécification, il est même facultatif. –

Répondre

0

Donc, après beaucoup de recherches, la seule solution viable est probablement d'utiliser une classe séparée (EJBProducer) qui utilise l'annotation CDI @Produces et cache la recherche JNDI. Ensuite, vous pouvez utiliser @Inject dans votre application. Le seul problème est que vous devez écrire JNDI pour chaque bean séparément. Voici un exemple: http://pastebin.com/3V3kKgD9

Je dois remercier Martin Polák pour cette solution.

1

Réponse courte: pas

JNDI est le go-to & & façon correcte ici.

Votre fichier WAR ne voit rien dans le fichier JAR puisqu'il ne dépend pas de lui. Il sera très probablement chargé avec un autre chargeur de classe. Si vous avez ajouté le fichier JAR en tant que dépendance, cela peut fonctionner. Cependant, je suppose que vous ne voulez pas aller de cette façon que vous avez d'autres déploiement (s) en fonction de ce JAR.

+0

Merci pour votre réponse. J'ai une dépendance à JAR dans "jboss-deployment-structure.xml" qui se trouve dans WEB-INF de mon WAR. Est-ce que ce n'est pas suffisant? Ou il y a un autre type de dépendance, que je peux définir? –

+0

Je voulais simplement ajouter un Maven '' (en supposant que ce soit ce que vous utilisez) à votre WAR. De plus, les deux archives devraient avoir 'beans.xml' - théoriquement, vous n'en avez pas besoin, mais c'est la façon la plus simple de vous assurer que vos classes sont choisies comme beans. En ce qui concerne 'jboss-deployment-structure', je ne suis pas sûr que cela puisse aider ici, mais encore une fois, je n'ai presque jamais utilisé cette fonctionnalité. – Siliarus