Comment injecter un Bean de Session dans un Message Driven Bean?
Que je suis assez nouveau à Java EE, donc cela peut être stupide.. ours avec moi pls 😀
Je voudrais injecter un bean session sans état dans un message-driven bean. Fondamentalement, le MDB reçoit un message de JMS, puis utilise un bean de session pour effectuer le travail. La session bean détient la logique métier.
Voici ma Session Bean:
@Stateless
public class TestBean implements TestBeanRemote {
public void doSomething() {
//business logic goes here
}
}
Le correspondant de l'interface:
@Remote
public interface TestBeanRemote {
public void doSomething();
}
Voici mon MDB:
@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class TestController implements MessageListener {
@EJB
private TestBean testBean;
public TestController() {
}
public void onMessage(Message message) {
testBean.doSomething();
}
}
Jusqu'à présent, pas la science de fusée, droit?
Malheureusement, lors du déploiement de ce à glassfish v3, et l'envoi d'un message à la appropriée de File d'attente JMS, j'ai des erreurs que glassfish est incapable de localiser le TestBean EJB:
java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/mvs.test.TestController/testBean' in SerialContext [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'mvs.test.TestBean#mvs.test.TestBean' [Root exception is javax.naming.NamingException: Lookup failed for 'mvs.test.TestBean#mvs.test.TestBean' in SerialContext [Root exception is javax.naming.NameNotFoundException: mvs.test.TestBean#mvs.test.TestBean not found]]]
Donc mes questions sont:
- est-ce la bonne façon de l'injection d'un bean de session dans un autre bean (en particulier un message driven bean)?
- pourquoi la dénomination de recherche de défaut?
Vous devez vous connecter pour publier un commentaire.
Pourriez-vous essayer de définir ce genre de choses:
Puis dans la MDB:
Si ce travail, je vais essayer de fournir une explication 🙂
Je pense que le problème de la très premier exemple est que vous essayez d'injecter de la mise en œuvre de l'EJB et pas de son interface. La section locale no-vue de l'interface de l'EJB 3.1 est seulement possible si vous ne définissez pas de n'importe quelle interface, pas même une seule télécommande. Par conséquent, la modification du point d'injection à la suivante devrait fonctionner:
Si vous utilisez votre application dans un environnement en clusters, de sorte que seule JVM, vous devriez penser à changer l'interface de @Local. Dès que vous accédez à des Ejb en utilisant leur interface à distance, vous obtenez beaucoup de frais généraux. Paramètres et valeurs de retour ne peut pas être consulté par référence, mais en valeur, car ils sont toujours copiés (spécification dit de faire). Cela pourrait conduire à performence de questions lorsqu'ils traitent avec des objets plus complexes.
Espère que contribué à.
Il semble que mon problème était lié à l'Inversion de Contrôle et causé par mon manque de connaissances et de Netbeans suggestions pour la Classe/les noms d'Interface.
J'ai découvert que - afin de trouver le droit de la fève et de la droite de l'interface - je devrait les nommer correctement. Voici ce qui fonctionne:
Et de la MDB-je accéder à "Tester" les pas 'TestBean':
Ok, j'ai découvert que si j'ai ajouter l'annotation @LocalBean à la session bean, il fonctionne. Ce que l' ...?