Na serveru Liberty před verzí 20.0.0.12 byly objekty Enterprise JavaBeans (EJB) vázány pouze na obor názvů java:[scope]. Objekty typu EJB bean nebyly vázány na obor názvů rozhraní JNDI (Java Naming and Directory Interface) kořenového adresáře serveru, což znamená, že nemůžete definovat názvy vazeb rozhraní JNDI. Atributy vazby EJB, které umožňují zadat název rozhraní JNDI na serveru WebSphere Application Server Traditional, byly ignorovány na serveru Liberty.
Následující atributy vazby EJB ze souboru ibm-ejb-jar-bnd.xml byly na serveru Liberty ignorovány.
session simple-binding-name
session component-id
session local-home-binding-name
session remote-home-binding-name
interface binding-name
Následující atributy vazby EJB ze souboru ibm-ejb-jar-bnd.xmi byly na serveru Liberty ignorovány.
Toto pravidlo označí všechny názvy vazeb rozhraní JNDI, které byly v Liberty ignorovány před 20.0.0.12. Pokud vaše aplikace používá tyto názvy v přímém vyhledávání rozhraní JNDI místo použití odkazů EJB, musíte použít Liberty verze 20.0.0.12 nebo novější nebo aplikaci upravit.
Použijete-li odkazy EJB, pravidlo Změna chování při vyhledávání objektů Enterprise JavaBean v předchozích verzí Liberty označí veškeré názvy rozhraní JNDI, které musí být převedeny na obor názvů java:, používáte-li verzi Liberty starší než 20.0.0.12.
Nepoužíváte-li odkazy EJB a používáte verzi Liberty starší než 20.0.0.12, doporučuje se použít novější verzi Liberty nebo vytvořit odkaz EJB pomocí stejného názvu rozhraní JNDI a nastavit odkaz EJB binding-name na název rozhraní JNDI java:[scope]. Nepřidáte-li odkaz EJB, musíte prohledat kód Java pro použití těchto názvů rozhraní JNDI a převést vyhledávací název na název rozhraní JNDI java:.
.
Příklad migrace EJB:
Následující příklad vytvoří odkaz EJB, který vám pomůže s migrací jakýchkoli problémů s vyhledáváním, pokud nepoužíváte Liberty verze 20.0.0.12 nebo novější.
Odkazovaný objekt EJB:
@Stateless
public class MyEJB implements
MyEJBInterface {
public String
sayHello(String name) {
return "Dobrý den, zde" + name + ".";
}
}
Vzdálené rozhraní:
@Remote
public interface MyEJBInterface {
String sayHello(String name);
}
Příklady odkazů EJB:
Dále jsou uvedeny příklady, jak deklarovat odkaz EJB v Liberty. Je požadováno buď 1a, nebo 1b ve spojení s 2a, 2b, 3a nebo 3b, aby bylo možné úspěšně propojit EJB a jeho odkaz. Např. doporučené volby jsou 1a a 2b pro snadné a úspěšné nastavení, ale pokud je 1b deklarováno ve spojení s 3b, získáte stejnou funkčnost jako doporučené nastavení.
- Samotný odkaz musí být deklarován pomocí anotace ve třídě odkazující na EJB, v souboru ejb-jar.xml nebo web.xml.
- Anotace EJB:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /span> < span class="JavaType">TestServlet< /span> {
@EJB(name="ejb/MyEJB")
MyEJB myEjb;
....
}
- ejb-jar.xml a web.xml:
< span class="Code"> < ejb-ref>
<ejb-ref-name>ejb/MyEJB</ejb-ref-name>
<ejb-ref-type>Relace</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
< ejb-ref>
- Je-li odkazovaný objekt EJB ve stejné aplikaci jako příslušný odkaz, není položka ibm-ejb-jar-bnd.xml nebo ibm-web-bnd.xml vyžadována. Jeden z následujících kroků umožní kontejneru EJB automaticky propojit objekt EJB a jeho odkaz v případě, že se nacházejí ve stejné aplikaci:
- Pokud implementuje vzdálené rozhraní EJB pouze jeden objekt typu bean v aplikaci, není vyžadována žádná další konfigurace.
- Pokud více objektů typu bean v aplikaci implementuje vzdálené rozhraní EJB, musí být prvek
beanName přidán do anotace @EJB. Používáte-li soubor ejb-jar.xml nebo web.xml, musí být prvek <ejb-link> přidán do existujícího prvku <ejb-ref>. Změny v bodech 1a a 1b jsou uvedeny zde:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /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>Relace</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<ejb-link>MyEJB</ejb-link>
< ejb-ref>
- Je-li odkazovaný objekt EJB v jiné aplikaci než její odkaz, musí být dokončen jeden z následujících kroků pro přidání vyhledávacího řetězce.
Tyto příklady ukazují vyhledávací řetězce pro aplikaci spuštěnou na stejném serveru:
- Přidejte prvku
lookup do anotace @EJB. Používáte-li soubor ejb-jar.xml nebo web.xml, musí být prvek <lookup-name> přidán do existujícího prvku <ejb-ref>. Změny v bodech 1a a 1b jsou uvedeny zde:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /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>Relace</ejb-ref-type>
<remote>com.test.MyEJBInterface</remote>
<lookup-name>java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface</lookup-name>
< ejb-ref>
- Deklarujte referenční vazbu v souboru ibm-ejb-jar-bnd.xml nebo ibm-web-bnd.xml:
< span class="Code"> < ejb-ref name="ejb/MyEJB"
binding-name="java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface" />
Atribut lookup, lookup-name nebo binding-name lze volitelně použít k odkazování na objekty EJB ve stejné aplikaci. V takovém případě může být hodnota nastavena na libovolné vhodné přímé vyhledání EJB popsané na konci této stránky.
Dále je uvedeno konečné vyhledání odkazu EJB:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:comp/env/ejb/MyEJB");
}
}
Volitelně jsou k dispozici tři volby pro vyhledání přímo EJB, nikoli pomocí odkazu EJB:
- Je-li objekt typu bean ve stejném modulu jako jeho odkaz:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:module/MyEJB!com.test.MyEJBInterface");
}
}
- Je-li objekt typu bean ve stejné aplikaci jako jeho odkaz:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:app/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
- Je-li definice objektu typu bean nalezena globálně v rámci stejného serveru:
< span class="Code"> < span class= "JavaKeyword"> veřejná třída < /span> TestEJBClient {
public static void
main(String[] args) {
....
MyEJBInterface myEjbInterface = (MyEJBInterface)
context.lookup("java:global/MyAPP/moduleA/MyEJB!com.test.MyEJBInterface");
}
}
Podrobnější informace o použití vazeb EJB viz
Použití objektů enterprise JavaBeans se vzdálenými rozhraními na serveru Liberty a
Přehled vazeb aplikace EJB 3.0 a EJB 3.1.