In Liberty-Versionen vor 20.0.0.12 wurden EJB-Beans (Enterprise JavaBeans) nur an den Namespace java:[scope] gebunden. EJB-Beans wurden nicht an einen servergebundenen JNDI-Namespace
(Java Naming and Directory Interface) gebunden, daher konnten Sie die JNDI-Bindungsnamen nicht definieren.
EJB-Bindungsattribute, die in WebSphere Application Server Traditional eine Spezifikation des JNDI-Namens erlauben, wurden in Liberty ignoriert.
Die folgenden EJB-Bindungsattribute aus der Datei ibm-ejb-jar-bnd.xml wurden in Liberty ignoriert.
session simple-binding-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
Die folgenden EJB-Bindungsattribute aus der Datei ibm-ejb-jar-bnd.xmi wurden in Liberty ignoriert.
Diese Regel markiert alle JNDI-Bindungsnamen, die in Liberty-Versionen vor 20.0.0.12 ignoriert wurden. Wenn Ihre Anwendung diese Namen in direkten JNDI-Suchen verwendet
anstatt EJB-Referenzen zu verwenden, müssen Sie Liberty Version 20.0.0.12 oder höher verwenden oder Ihre Anwendung ändern.
Wenn Sie EJB-Referenzen verwenden, markiert die Regel Geändertes Verhalten bei Suchfunktionen für Enterprise JavaBeans in früheren Versionen von Liberty
alle JNDI-Namen, die in den java:-Namespace konvertiert werden müssen, wenn Sie eine ältere Version von Liberty als 20.0.0.12 verwenden.
Wenn Sie keine EJB-Referenzen verwenden und eine ältere Version von Liberty als 20.0.0.12 verwenden, wird empfohlen, eine neuere Version von Liberty als 20.0.0.12 zu verwenden oder
eine EJB-Referenz mit demselben JNDI-Namen zu erstellen und die EJB-Referenz binding-name
auf den java:[scope]-JNDI-Namen zu setzen. Wenn Sie keine EJB-Referenz hinzufügen, müssen Sie Ihren Java-Code nach JNDI-Namen durchsuchen und den Suchnamen in den java:-JNDI-Namen konvertieren.
Beispiel für die Migration von EJBs:
Im folgenden Beispiel wird eine EJB-Referenz für die Migration von Lookup-Problemen erstellt, wenn Sie Liberty
Version 20.0.0.12 oder höher nicht verwenden.
Referenzierte EJB:
@Stateless
public class MyEJB implements
MyEJBInterface {
public String
sayHello(String name) {
return "Hallo" + Name + ".";
}
}
Remote-Schnittstelle:
@Remote
public interface MyEJBInterface {
String sayHello(String name);
}
Beispiele für EJB-Referenzen:
Im Folgenden finden Sie Beispiele für die Deklaration einer EJB-Referenz in Liberty. 1a oder 1b ist zusammen mit 2a, 2b, 3a und 3b erforderlich, um eine EJB und ihre Referenz erfolgreich zu verlinken.
Die empfohlenen Optionen sind beispielsweise 1a und 2b für ein einfaches und erfolgreiches Setup, aber wenn
1b zusammen mit 3b deklariert wird, erhalten sie dieselbe Funktionalität wie beim empfohlenen Setup.
- Die Referenz selbst muss mit einer Annotation in der Klasse, die die EJB referenziert, in der Datei
ejb-jar.xml oder in der Datei web.xml deklariert werden.
- EJB-Annotation:
< span class="Code"> < span class= "JavaKeyword"> allgemein zugängliche Klasse < /span> < span class="JavaType">TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- ejb-jar.xml und web.xml:
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb/MyEJB</ejb-ref-name>
<ejb-ref-type>-Sitzung</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-ref>
- Wenn sich die referenzierte EJB in derselben Anwendung befindet wie ihre Referenz, ist kein Eintrag in der Datei ibm-ejb-jar-bnd.xml oder
ibm-web-bnd.xml erforderlich. Einer der folgenden Schritte ermöglicht dem EJB-Container, die EJB und ihre Referenz automatisch zu verlinken, wenn
sie sich in derselben Anwendung befinden:
- Wenn nur eine einzige Bean in der Anwendung die EJB-Remote-Schnittstelle implementiert, ist keine weitere Konfiguration erforderlich.
- Wenn mehrere Beans in der Anwendung die EJB-Remote-Schnittstelle implementieren, muss das Element
beanName
der Annotation @EJB hinzugefügt werden. Bei der Verwendung einer Datei ejb-jar.xml
oder web.xml muss das Element <ejb-link> dem vorhandenen Element
<ejb-ref> hinzugefügt werden. Änderungen an 1a und 1b werden im Folgenden gezeigt:
< span class="Code"> < span class= "JavaKeyword"> Allgemein zugängliche Klasse < /span> TestServlet {
@EJB(name="ejb/MyEJB" beanName="MyEJB")
MyEJB myEjb;
....
}
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb/MyEJB</ejb-ref-name>
<ejb-ref-type>-Sitzung</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-link>MyEJB</ejb-link>
<ejb-ref>
- Wenn sich die referenzierte EJB in einer anderen Anwendung als ihre Referenz befindet, muss einer der folgenden Schritte ausgeführt werden, um eine Lookup-Zeichenfolge hinzuzufügen.
Die folgenden Beispiele zeigen Lookup-Zeichenfolgen für eine Anwendung, die in demselben Server ausgeführt wird:
- Element
lookup zur Annotation @EJB hinzufügen. Bei der Verwendung einer Datei ejb-jar.xml
oder web.xml muss das Element <lookup-name> dem vorhandenen Element
<ejb-ref> hinzugefügt werden. Änderungen an 1a und 1b werden im Folgenden gezeigt:
< span class="Code"> < span class= "JavaKeyword"> Allgemein zugängliche Klasse < /span> TestServlet {
@EJB(name="ejb/MyEJB" lookup="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface")
MyEJB myEjb;
....
}
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb/MyEJB</ejb-ref-name>
<ejb-ref-type>-Sitzung</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
<ejb-ref>
- Referenzbindung in der Datei ibm-ejb-jar-bnd.xml oder ibm-web-bnd.xml deklarieren:
< span class="Code"> < ejb-ref name="ejb/MyEJB"
binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
Optional kann das Attribut lookup, lookup-name oder binding-name für die Referenzierung von
EJBs in derselben Anwendung verwendet werden. In diesem Fall kann als Wert jedes gültige direkte EJB-Lookup gesetzt werden, das am Ende dieser Seite beschrieben ist.
Im Folgenden sehen Sie die endgültige EJB-Referenzsuche:
< span class="Code"> < span class= "JavaKeyword"> öffentliche Klasse < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:comp/env/ejb/MyEJB");
}
}
Alternativ gibt es drei direkte Lookup-Optionen für EJBs, bei denen keine EJB-Referenz verwendet wird:
- Eine Bean befindet sich in demselben Modul wie ihre Referenz:
< span class="Code"> < span class= "JavaKeyword"> öffentliche Klasse < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
}
}
- Eine Bean befindet sich in derselben Anwendung wie ihre Referenz:
< span class="Code"> < span class= "JavaKeyword"> öffentliche Klasse < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
- Die Bean-Definition muss sich global in demselben Server befinden:
< span class="Code"> < span class= "JavaKeyword"> öffentliche Klasse < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
Weitere Informationen zur Verwendung von EJB-Bindungen finden Sie unter
Enterprise JavaBeans mit fernen Schnittstellen in Liberty verwenden und
Übersicht über EJB-3.0- und EJB-3.1-Anwendungsbindungen.