În Liberty înainte de versiunea 20.0.0.12, bean-urile EJB (Enterprise JavaBeans) au fost legate doar de spaţiul de nume java:[scope]. Bean-urile EJB nu au fost legate la un spaţiu de nume JNDI (Java Naming and Directory
Interface), ceea ce înseamnă că nu aţi putut defini numele de legare
JNDI. Atributele legărilor EJB care vă permit să specificaţi numele JNDI în WebSphere Application Server tradiţional au fost ignorate în Liberty.
Următoarele atribute de legare EJB din fişierul ibm-ejb-jar-bnd.xml au fost ignorate în Liberty.
session simple-binding-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
Următoarele atribute de legare EJB din fişierul ibm-ejb-jar-bnd.xmi au fost ignorate în Liberty.
Această regulă semnalează toate numele de legare JNDI care au fost ignorate în Liberty înainte de 20.0.0.12. Dacă aplicaţia dumneavoastră utilizează aceste nume în căutări JNDI directe mai
degrabă decât utilizarea referinţelor EJB, trebuie să utilizaţi Liberty
versiunea 20.0.0.12 sau mai nouă sau să vă modificaţi aplicaţia.
Dacă utilizaţi referinţe EJB, regula
Modificare de comportament la căutările pentru Enterprise
JavaBeans în versiunile anterioare de Liberty semnalează orice nume JNDI
care trebuie să fie convertit la spaţiul de nume java: dacă se
foloseşte o versiune de Liberty mai veche de 20.0.0.12.
Dacă nu utilizaţi referinţe EJB şi utilizaţi o versiune de Liberty mai
veche de 20.0.0.12, este recomandat să utilizaţi o versiune mai nouă de Liberty
sau să creaţi o referinţă EJB folosind acelaşi nume JNDI şi să setaţi referinţa
EJB binding-name la numele JNDI :[java:scope]. Dacă nu adăugaţi o referinţă EJB,
trebuie să vă scanaţi codul Java pentru utilizarea acestor nume JNDI şi să convertiţi
numele de căutare la numele JNDI java:.
Exemplu de migrare EJB:
Următorul exemplu creează o referinţă EJB pentru a vă ajuta să migraţi orice
probleme de căutare dacă nu utilizaţi Liberty versiunea 20..0.0.12 sau mai nouă.
EJB referit:
@Stateless
public class MyEJB implements
MyEJBInterface {
public String
sayHello(String name) {
retur "Hello there" + nume +.;
}
}
Interfaţă la distanţă:
@Remote
public interface MyEJBInterface {
String sayHello(String name);
}
Exemple de referinţă EJB:
Următoarele sunt exemple de declarare a unei referinţe EJB în Liberty. Pentru a lega cu succes un EJB cu referinţa sa, este
necesară fie 1a, fie 1b, împreună cu 2a, 2b, 3a sau 3b. De exemplu, opţiunile recomandate sunt 1a şi 2b pentru a realiza cu succes o
setare uşoară, dar, dacă este declarată 1b împreună cu 3b, veţi obţine aceeaşi funcţionalitate ca la setarea recomandată.
- Referinţa propriu-zisă trebuie să fie declarată folosind o adnotare în clasa care face referire la EJB,
în ejb-jar.xml sau în web.xml.
- Adnotare EJB:
< span class="Code"> < span class= "JavaKeyword" > public class < /span> < span class= "JavaType" >TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- ejb-jar.xml şi web.xml:
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb/MyEJB</ejb-ref-name>
<ejb-ref-type>Sesiune</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
< ejb-ref>
- Dacă EJB referit se află în aceeaşi aplicaţie ca referinţa sa, nu este necesară o intrare
ibm-ejb-jar-bnd.xml sau ibm-web-bnd.xml. Unul dintre paşii următori vor
permite containerului EJB să lege automat EJB şi referinţa sa dacă acestea se află în aceeaşi aplicaţie:
- Dacă un singur bean din aplicaţie implementează interfaţa EJB la distanţă, nu este necesară o configurare suplimentară.
- Dacă mai multe bean-uri din aplicaţie implementează interfaţa EJB la distanţă, trebuie să fie adăugat elementul
beanName la adnotarea @EJB. Dacă se utilizează un ejb-jar.xml sau
web.xml, trebuie să fie adăugat elementul <ejb-link> la elementul
<ejb-ref> existent. Modificările la 1a şi 1b sunt arătate aici:
< span class="Code"> < span class= "JavaKeyword" > public class < /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>Sesiune</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-link>MyEJB</ejb-link>
< ejb-ref>
- Dacă EJB-ul referit nu se află în aceeaşi aplicaţie cu referinţa sa, atunci trebuie să fie finalizat unul dintre următorii paşi
pentru a adăuga un şir de căutare.
Aceste exemple prezintă şiruri de căutare pentru o aplicaţie ce rulează pe acelaşi server:
- Adăugaţi elementul
lookup la adnotarea @EJB. Dacă se utilizează un
ejb-jar.xml sau web.xml, trebuie să fie adăugat elementul
<lookup-name> la elementul <ejb-ref> existent. Modificările la 1a şi 1b sunt arătate aici:
< span class="Code"> < span class= "JavaKeyword" > public class < /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>Sesiune</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
< ejb-ref>
- Declaraţi legarea de referinţă în ibm-ejb-jar-bnd.xml sau
ibm-web-bnd.xml:
< span class="Code"> < ejb-ref name="ejb/MyEJB
obligatorii-name="java:global/MyAPP/moduleA/MyEJBcom.test.MyEJBInterface
Opţional, poate fi folosit atributul lookup, lookup-name sau binding-name pentru referirea
EJB-urilor din aceeaşi aplicaţie. În acest caz, valoarea poate fi setată la orice căutare EJB directă aplicabilă descrisă la sfârşitul
acestei pagini.
Următoarea este căutarea de referinţă EJB finală:
< span class="Code"> < span class= "JavaKeyword" > public class < /span> TestEJBClient
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:comp/env/ejb/MyEJB");
}
}
Sau, există trei opţiuni pentru a căuta un EJB direct, fără a utiliza o referinţă EJB:
- Când un bean se află în acelaşi modul ca referinţa sa:
< span class="Code"> < span class= "JavaKeyword" > public class < /span> TestEJBClient
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
}
}
- Când un bean se află în aceeaşi aplicaţie ca referinţa sa:
< span class="Code"> < span class= "JavaKeyword" > public class < /span> TestEJBClient
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
- Când definiţia de bean trebuie să fie găsită la nivel global în acelaşi server:
< span class="Code"> < span class= "JavaKeyword" > public class < /span> TestEJBClient
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
Pentru mai multe informaţii despre folosirea legărilor EJB, vedeţi
Utilizarea bean-urilor Java enterprise cu interfeţe la distanţă pe Liberty şi Privire generală asupra legărilor aplicaţiilor
EJB 3.0 şi EJB 3.1.