@EJB in JBoss 5.1.0 GA?
-
17-09-2020 - |
Frage
Ich kämpfe schon seit einiger Zeit darum.
Ich versuche, mich auf EJB 3.0 vorzubereiten.Ich verwende JBoss 5.1.0 GA als meinen Anwendungsserver.Ich habe mit einer sehr einfachen zustandslosen Session-Bean mit lokaler Schnittstelle und einem einfachen JSP-Servlet-Client begonnen, der die Session-Bean-Methode aufruft.All dies, während ich versucht habe, es zu verwenden @EJB
Annotation zum Einfügen einer Session-Bean in die Servlet-Klasse.
public class SampleServlet extends HttpServlet {
@EJB
private PersonLocal person;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("In servlet");
response.getWriter().write("Person Name : "+person.getName());
System.out.println(person.getName());
}
}
Ich verwende JBoss 5.1.0 GA mit dem Standard Aufbau.(Ich habe es auch mit versucht alle Aufbau)
Allerdings bekam ich immer einen Nullverweis auf die Session-Bean-Injection.Nachdem ich etwa einen Tag lang gekämpft hatte, probierte ich stattdessen endlich die hässliche JNDI-Suchmethode von EJB 2.x aus @EJB
Anmerkung mit der Konfiguration für JNDI, die im angegeben ist jndi.properties
Datei und es hat ohne weitere Änderungen funktioniert!
Nun habe ich versucht, in den JBoss-Dokumenten herauszufinden, ob JBoss 5.1.0 GA die Injektion mit unterstützt oder nicht @EJB
Anmerkung, konnte aber keine konkrete Antwort finden.Kann mir jemand sagen, ob das der Fall ist?Denn ich würde die Annotation wirklich der JNDI-Suche vorziehen (ich meine, wer würde das nicht tun?).Vermisse ich etwas?
Hätte das wahrscheinlich in die JBoss-Foren stellen sollen, aber ...Ich bin süchtig nach diesem Ort ;-)
Lösung
Dies wird von JBoss 5.x definitiv unterstützt, da es Java EE 5-zertifiziert ist.
Eigentlich schlage ich vor, das zu überprüfen Kapitel 11.Einführung in die EJB-Injektion in Servlets des JBoss EJB3-Tutorials, Sie beschreiben ein detailliertes und schrittweises Beispiel.
Und achten Sie besonders auf folgenden Hinweis:
Damit die Injektion in einem Webmodul stattfinden kann, sollte Ihr Web.xml die 2.5-Version der Web-App XSD verwenden:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
Andere Tipps
Ich hatte ein ähnliches Problem bei der Verwendung eines Remote-EJB, aber es lag nicht an der Web-App-Version, sondern daran, wie mein Client das EJB nachschlug.
Folgendes hat bei mir funktioniert:
//bean
@Stateless(name="xxxxService")
@Remote(xxxxRemote.class)
public class xxxxService implements xxxxRemote {
//interface - note that no annnotation is required
public interface xxxxRemote {
//in the client
@EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName='
private xxxxRemote xxxx;
Bei meinem Projekt (erstellt mit Maven) befindet sich der Client in einer Webanwendung und das EJB in einem EJB-Projekt, das dann in ein EAR-Projekt eingebunden wird.Die JNDI-Zuordnung erfolgt in jboss.xml, das sich im EJB-Projekt befindet (in meinem Projekt src/main/resources/META-INF) und sieht folgendermaßen aus:
<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema"
xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
version="5.0">
<enterprise-beans>
<session>
<ejb-name>xxxxService</ejb-name>
<jndi-name>myJndiNameForxxxx</jndi-name>
</session>
</enterprise-beans>
</jboss>
Das war alles, was es brauchte, und jetzt kann ich vom Client aus auf das EJB zugreifen.Hoffe, das hilft jemandem.
Wenn weiterhin Probleme auftreten, können Sie in der JMX-Konsole nachsehen, ob der JNDI-Eintrag angezeigt wird.Schauen Sie unter „jboss“ > „service=JNDIview“ > „list“ nach und klicken Sie auf die Schaltfläche „Invoke“.Wenn Ihr Dienst korrekt bereitgestellt wurde, sollten Sie den JNDI-Namen (in meinem Beispiel myJndiNameForxxxx) unter „ProxyFactory“ sehen.