Wie zu injizieren EJB im java-web-service SOAP
bin ich triyng die Entwicklung eines einfachen web service in Java, mit einer EJB, die mit EJBs in der jar-Datei und WebServices in der war-Datei, beides verpackt in einem Ohr. Wir verwenden EjB 3.0 auf JBOSS-AS 7.1.
Hier meine EJB-Klasse mit 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);
}
Und hier ist mein web-service -, die injizieren, die vorherigen 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);
}
}
Die Bereitstellung funktioniert gut, aber wenn ich rufe meine web-service, die EJB ist immer null
(error : java.nullpointerException).
So, ich versucht, um einen @Stateless
auf meine web-Service konvertieren zu EJB-aber ohne Erfolg, wenn ich versuche, Sie zu verbrauchen, die von einem web service-client.
Dann habe ich versucht, Zugriff auf Ejb-von lokalen jndi-lookup wie unten, wobei der lokale jndi-url in das JBOSS-log :
final String jndi = "java:module/TestEjb!fr.test.ITestEjb";
testEjb = (ITestEjb) new InitialContext().lookup(jndi);
Aber es hat nicht funktioniert.
Schließlich habe ich versucht mit dem globalen jndi-url wie unten :
final String jndi = "ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb"
testEjb = (ITestEjb) new InitialContext().lookup(jndi);
Und es funktioniert gut !!
So, ich verstehe nicht, warum mein webservice zugreifen können, die lokal auf Ihrem EJB-durch Injektion oder lokalen Jndi Weg?
- Sind
TestEjb
undAuthentificationWS
im gleichen OHR? Sind Sie in der gleichen ejb-jar? - Die application-server-Produkt und die version verwenden Sie?
- Marschall ja, ich habe versucht, aber keine Effekte
- Jboss 7.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund ist, weil in der JBOSS-ALS 7.1 -, ejb-service bereitgestellt und zugeordnet, die in verschiedener Weise. Wenn Sie nicht geben Sie den zugeordneten Namen für den stateless-bean, die Sie tun müssen, schauen Sie mit seinen globalen Namen, wie z.B.: ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb
Können Sie versuchen, fügen Sie den zugeordneten Namen, indem Sie die folgenden:
- Und in deiner webservice:
Und in Sie web.xml:
In diesem Fall, ich nehme an, Sie sind die Bereitstellung von webservice als web-Modul. Für Referenz-wie-deploy-web-service als web-Modul, werfen Sie bitte einen Blick auf diesen link: http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/
Ich vorher benutzte: new InitialContext().lookup(java:app/domain/TestService)
Umgewandelt Ohr und genutzt:
Diese scheint zu funktionieren, müssen Sie aber festlegen, @Remote im Test-interface" ():). Der Webservice ist im Krieg, domain in ein Glas, und beide sind enthalten in-ear-und eingesetzt in Glassfish (3.1.2). Es ist schade, ich war die Verwendung der annotation @Remote, weil es alle in dem gleichen Ohr. Wenn ich weglassen, @Remote, bekomme ich die exception bei der Bereitstellung in Glassfish: "die Versuchen, eine ejb-ref-auf ein EJB, während die EJB-nicht definiert remote-interfaces". Gibt es eine Möglichkeit das weglassen der @Remote ??
Versuchen, es ohne die Schnittstelle, die Sie nicht brauchen, um zu definieren ein interface in EJB3.x mehr
Dann Spritzen Sie in web-service wie folgt