EJB 2.x und EJB 3.0 vereinen

EJB 2 und EJB 3 im Container

Jeder EJB 3 Container muss auch EJB 2.x Beans verwalten können. Beim Design der neuen Spezifikation war es wichtig, dass
– eine EJB 2.x Bean in eine EJB 3.0 Bean injiziert werden kann,
– eine EJB 3.0 Bean sich von außen als EJB 2.x Bean ansprechen lässt.

Klassisches Home/Component-Interface

Nehmen wir für eine Session-Bean eine EJBHome-Schnittstelle MyHome an, dessen create()-Methode ein MyRemote liefert.

public interface MyHome extends EJBHome {
public MyRemote create()
throws CreateException, RemoteException;
}

public interface MyRemote extends EJBObject {
public void foo() throws RemoteException;
}

@EJB injiziert eine EJB 2 Bean

Mit der Annotation @EJB injiziert der Container nicht nur EJB 3 Verweise, sondern auch EJB 2 Beans. Da EJB 2 Beans kein Business-Interface haben, injiziert der Container Exemplare, die das Home-Interface implementieren. Der Container soll die Objektvariable myHome belegen:

@EJB private MyHome myHome;

Der Zugriff auf die EJB 2-Bean läuft wie üblich über create():

MyRemote bean = myHome.create();
bean.foo();

@RemoteHome/@LocalHome

Mit den neuen Annotationen aus EJN 3.0 kann eine Enterprise-Bean mit einer EJB 2 Sicht veröffentlicht werden. Dazu ist ein Remote- und Component-Interface nötig.
– Etwa wie im Beispiel MyHome und MyRemote.
Im nächsten Schritt wird die Bean mit @RemoteHome/@LocalHome annotiert, etwa so:

@RemoteHome( MyHome.class )

Nur das Home-Interface, aber nicht das Componten-Interface, kommt in die Annotation.
Die EJB implementiert das Componten-Interface nicht, muss auch keine Annotationen vor diese Methoden setzen. Die create-Methoden werden mit @Init annotiert. Der Name ist egal.

Beispiel einer EJB 2 mit der EJB 3 API

@Stateful
@RemoteHome( MyHome.class )
public class MyEJB2Bean
{
@Init
public void create() { }

public void foo() { }
}

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert