Referenzierung von EJBs aus POJOS

Aus SDQ-Wiki

Einleitung

HowTo

Der folgende Beispiel-Code funktioniert mit Glassfish [1] und allen abgeleiteten Application Servern, wie dem Sun Java Application Server 9.0. In diesem Beispiel werden alle EJB Referenzen über Java Annotations gemacht.

Übersicht

In diesem Kurz-Tutorial wird beschrieben, wie man aus POJOs Referenzen auf EJB Komponenten referenzieren kann. Dazu werden zwei Stufen benötigt

  • Setzen eines lokalen JNDI Kontextes für die benötigten Komponenten
  • Lookup der Komponenten in einer abhängigen POJO Klase

Voraussetzungen

Damit eine POJO Klasse eine Referenz auf eine über JNDI gemanagte Ressource bekommen kann, muss sie in einem Komponentenkontext aufgerufen werden. Innerhalb einer WEB Application (*.web Deploy Datei) existiert ein gemeinsamer Kontext, so dass es ausreicht, dass die Referenz in einer beliebigen vom Container gemanagten Komponente gesetzt wird. Im Fall von EJBs ist es jedoch so, dass jede EJB einen eigenen Komponentekontext besitzt, die Referenzen also in der direkt aufrufenden, vom Container gemanagten Komponente gesetzt werden müssen.

Injection einer EJB (Session Bean)

Schritt eins: CallerBean delegiert einen Job an eine POJO Klasse, die selbst wiederum eine andere EJB referenziert.

Session Bean CallerBean (die aufrufende Bean):

package beispiel;

/*
 * Einige Imports
 */

@Stateless
public class CallerBean implements CallerLocal {
    // Referenzen setzen
    @EJB(name="ejb/AnotherBean")        // Hier setzt man den JNDI Referenznamen
    private AnotherLocal anotherFacade;

    public void callPOJO {
        POJO pojo = new POJO();
        String result = pojo.delegateProcessing();
    }
}

Schritt zwei: POJO Klasse POJO besorgt sich eine Referenz auf eine andere benötigte Session Bean AnotherBean und ruft dort eine Methode auf: POJO Klasse, die sich eine Referenz auf die Bean AnotherBean holt und dort eine Methode aufruft:

package beispiel;

/*
 * Einige Imports
 */

public class POJO {
    public String delegateProcessing() {
        AnotherLocal anotherFacade = lookupAnotherBean();
        return anotherFacade.delegateMoreProcessing();
    }

    private AnotherLocal lookupAnotherBean() {
        try {
            Context c = new InitialContext();
            return (TickPublisherLocal)
                c.lookup("java:comp/env/ejb/AnotherBean"); // Hier benutzt man den gesetzten JNDI Namen
        } catch(javax.naming.NamingException ne) {
            // TODO
        }
    }
}

Wie im obigen Beispiel ersichtlich, muss man darauf achten, dass der gesetzte JNDI Name zum Lookup benutzt wird. Der Glassfish Application Server legt alle EJB Referenzen unter dem Root Kontext comp/env/ejb/ ab, deshalb muss dieser vor dem definierten JNDI Namen stehen. Bei anderen Containern ist es nicht immer so.

Weitergehende Informationen

JNDI Referenzierung unter Glassfish [2]

Siehe auch

EJB 3.0 Dependency Injection