This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Sonntag, 27. Dezember 2009

ServiceLocator - Zugriff auf Stateless SessionBeans aus einem POJO (neues mit EJB 3.1)

Um von einem POJO auf einen Stateless SessionBean (SLSB) zugreifen zu können, gibt es keine Möglichkeit den SessionBean per Annotation á la @EJB zu injizieren. Das injizieren klappt nur bei gemanagten Klassen (Session Beans oder Servlets zum Beispiel).
Ähnliche Probleme gibt es allerdings auch bei einem "gemanagten" JSF Managed Bean (JSF2.0 bei der Verwendung des View-Scopes (@ViewScoped) und der Annotation @EJB).


Hier hilft das Service Locator Pattern weiter (siehe http://mr678.blogspot.com/2008/10/ejb3-und-servicelocator.html). Mit Hilfe dieses Patterns wird ein Session Bean lokalisiert.


In meinen Anwendungen möchte ich Öfters per Local Interface innerhalb der gleichen Applikation (WAR oder EAR File) einen SLSB nutzen. Bisher war der Zugriff über JNDI auf verschiedenen App Servern unterschiedlich. Am meisten hat mich bisher daran gestört, dass ich den Name des EAR Files hier immer hart codiert ist.
Mit der JEE6 Spec (EJB3.1) gibt es hier nur einen standardisierten Zugriff. Details hierzu sind in einem Blog von Mahesh Kannan von sun (siehe http://blogs.sun.com/MaheshKannan/entry/portable_global_jndi_names)


Kurzfassung:
Der Zugriff innerhalb der gleichen Applikation erfolgt wie folgt:


EAR File: java:app/<module-name>/<bean-name>!<fully-qualified-intf-name>
bzw.
WAR File: java:module/<bean-name>!<fully-qualified-intf-name>


Nachdem ich im Moment kleinere Applikation auf dem AppServer nur noch als WAR Modul baue, benötige man in diesem Fall überhaupt keine hart codierten Module- oder Applikationsnamen mehr. 
(Adam Bien hat hier sehr interessante Blog Einträge zum Thema Applikationen als WAR Module deployen; http://www.adam-bien.com/roller/abien/entry/is_java_ee_6_warhttp://www.adam-bien.com/roller/abien/entry/java_ee_6_kills_the)


Meine ServiceLocator Klasse zum Zugriff auf SLSBs innerhalb meines WAR Files schaut daher ganz einfach aus:



@SuppressWarnings("unchecked")
public static <T> T getService(Class<T> clazz) {
  try {
  InitialContext ctx = new InitialContext();
  String lookupPath = "java:module/"
           + clazz.getSimpleName() 
           + "!" + clazz.getName();

  return (T) ctx.lookup(lookupPath);
  } catch (NamingException e) {
  throw new ServiceLocatorException(e);
  }
}

Keine Kommentare:

Kommentar veröffentlichen