Az alkalmazás-szerver, amikor létrehozunk egy Session Bean-t, automatikusan regisztrálja azt a JNDI kontextusban. Az regisztrált Bean-ekre referenciát legegyszerűbben a függőség-injektálással szerezhetünk, a szerver leveszi a direkt név-feloldás terhét vállunkról. Az említett módszer egységesen működik minden alkalmazás-szerveren, viszont a megvalósítása már korántsem egységes. Minden gyártó saját elképzelése szerint oldotta meg a feladatot.
- JBoss global JNDI name: ejbapp/BeanName/local
- GlassFish global JNDI name: InterfaceClass
- WebSphere Community Edition global JNDI name: ejbapp-ejb/BeanName/InterfaceClass
- Oracle Application Server (OC4J) global JNDI name: BeanName
Mivel az alkalmazás-szerver elrejti előlünk a feloldás problémáját, egészen addig amíg van lehetőségünk a függőség-injektálásra támaszkodni, kódunk hordozható marad. Viszont abban a pillanatban, amikor pl. egy nem menedzselt objektumból, vagy egy unit-tesztelőből kényszerülünk direkt JNDI név-feloldásra, kénytelenek vagyunk gyártó specifikus kódot készíteni.
Egy egyszerű példa szemlélteti a problémát EJB 3 környezetben:
@Remote public interface JNDITestBeanInterface { String test(); }
@Stateless(name="JNDITestBean") public class JNDITestBean implements JNDITestBeanInterface { public String test() { return "ok"; } }
public class JNDITestBeanClient { public static void main(String[] args) throws Exception { Context context = new InitialContext(); JNDITestBeanInterface testBean = (JNDITestBeanInterface) context.lookup("JNDITest/JNDITestBeanInterface/remote"); System.out.print(testBean.test()); } }
Az EJB 3.1 specifikáció megoldást kínál, mégpedig úgy, hogy egységesíti a név-regisztráció módját, így azon alkalmazás-szerverek, melyek implementálni szeretnék a specifikációt kénytelenek követni is azt.
java:global[/<application-name>]/<module-name>/<bean-name>#<interface-name>
@Stateless @LocalBean public class JNDITestBean { public String test() { return "ok"; } }
public class JNDITestBeanClient { public static void main(String[] args) throws Exception { Context context = new InitialContext(); JNDITestBean testBean = (JNDITestBean) context.lookup("java:global/JNDITest/JNDITest-ejb/JNDITestBean"); System.out.print(testBean.test()); } }
Az "interface-name" elhagyható, amenniyben interface nélküli Bean-re szeretnénk referenciát szerezni, továbbá ha az egyszerűsített deployment technológiát használva a WAR-ba helyeztük az EJB réteget az "application-name" azaz az alkalmazás neve opcionálissá válik.
Nincsenek megjegyzések:
Megjegyzés küldése