Comment injecter des EJB dans java web service SOAP
je suis triyng de développer un service web simple en Java qui utilise un EJB, avec des Ejb dans le fichier jar et WebServices dans la guerre de fichier, à la fois emballés dans une oreille. Nous utilisons des EjB 3.0 sur JBOSS-COMME 7.1.
Ici mon EJB classe avec son interface :
@Stateless
public class TestEjb implements ITestEjb {
public boolean authentifier(String login, String password) {
if(login.equals("nico") && password.equals("nr"))
return true;
else
return false;
}
}
@Local
public interface ITestEjb {
public boolean authentifier(String login, String password);
}
Et voici mon service web qui injectent le précédente EJB :
//@Stateless
@WebService
@SOAPBinding(style = Style.RPC)
public class AuthentificationWS {
@EJB
private ITestEjb testEjb;
public boolean authentifier(String login,String password) {
return testEjb.authentifier(login, password);
}
}
Le déploiement fonctionne bien mais quand je l'appelle mon service web, l'EJB est toujours null
(error : java.nullpointerException).
J'ai donc essayé d'ajouter un @Stateless
à mon Service web pour convertir les EJB, mais sans succès, lorsque j'essaie de le consommer par un client de service web.
Puis j'ai essayé d'accès Ejb par local recherche jndi comme ci-dessous, en prenant le local jndi url dans le journal de JBOSS :
final String jndi = "java:module/TestEjb!fr.test.ITestEjb";
testEjb = (ITestEjb) new InitialContext().lookup(jndi);
Mais il ne fonctionne pas.
Enfin j'ai essayé avec le jndi global url comme ci-dessous :
final String jndi = "ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb"
testEjb = (ITestEjb) new InitialContext().lookup(jndi);
Et il fonctionne bien !!
Donc, je ne comprends pas pourquoi mon webservice ne peut pas accéder localement à son EJB par injection ou local Jndi façon?
- Sont
TestEjb
etAuthentificationWS
dans la même OREILLE? Sont-ils dans le même fichier ejb-jar? - De serveur d'applications de produit et la version utilisez-vous?
- Marschall Oui j'ai essayé mais aucun effet
- Jboss 7.1
Vous devez vous connecter pour publier un commentaire.
La raison en est que dans JBOSS-COMME 7.1, ejb service est déployé et cartographié de manière différente. Si vous ne spécifiez pas le nom mappé pour stateless bean, vous aurez à faire rechercher à l'aide de son nom global, comme ceci: ejb:Num-oreille-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb
Vous pouvez essayer d'ajouter le nom mappé par ce qui suit:
Et dans votre webservice:
Et vous web.xml:
Dans ce cas, je suppose que vous déployez webservice web du module. Pour la référence sur la façon de déployer le service web dans le module web, veuillez prendre un coup d'oeil sur ce lien: http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/
J'ai utilisé avant: new InitialContext().de recherche(en java:app/domaine/TestService)
Converti à l'oreille et utilisés:
Cela semble fonctionner, mais le besoin de définir @Distance dans l'interface de Test ():). Webservice est en guerre, un domaine dans le bocal et les deux sont contenues dans l'oreille et déployé dans Glassfish (3.1.2). C'est dommage, j'ai dû utiliser l'annotation @Remote, car il est tous dans la même oreille. Si j'omets le @Distance, j'obtiens une exception à l'heure du déploiement dans Glassfish: "en Essayant de mettre un ejb-ref sur un EJB, tandis que les EJB ne pas définir les interfaces à distance". Est-il possible d'omettre l' @Distance ??
L'essayer sans l'interface, vous n'avez pas besoin de définir une interface en EJB3.x plus
Puis à l'injecter dans le web service, comme suit