JAX-RS 2.0-Integration mit EJB und CDI

Enterprise JavaBeans (EJB) und Contexts and Dependency Injection (CDI) können in JAR-RS 2.0 in Liberty integriert werden.

Damit JAX-RS 2.0 für Enterprise-Beans funktioniert, müssen Sie die Annotation @Path für die Klasse einer Bean verwenden und sie in eine Stammressourcenklasse konvertieren.

Wenn Sie EJB integrieren, können Sie die Enterprise JavaBeans mit Annotationen versehen und sie als REST-Endpunkte zugänglich machen. Sie können auch die JTA und die Sicherheitsfunktionen von EJB verwenden. JAX-RS 2.0 in Liberty unterstützt die Verwendung von statusunabhängigen und Singleton-Session-Beans als Stammressourcenklassen, Provider und Anwendungsunterklassen. Wenn Sie CDI integrieren, können Sie CDI-Beans oder Managed Beans als REST-Endpunkte annotieren und CDI für Web-Services nutzen. JAX-RS 2.0 in Liberty unterstützt Beans nach CDI-Art als Stammressourcenklassen, Provider und Anwendungsunterklassen. Provider und Anwendungsunterklassen müssen Singletons sein oder den Anwendungsbereich verwenden. Die CDI-Spezifikation vereinfacht die Integration von Java™-EE-Komponenten verschiedener Arten. Sie stellt einen allgemeinen Mechanismus für das Einfügen von Komponenten wie EJB-Komponenten oder Managed Beans in andere Komponenten, z. B. in JSPs oder EJBs, bereit.

Bei EJB können Sie Annotationen für Stateless Session-Beans und Singleton-POJO-Beans verwenden.
  • Verwenden Sie für eine Stateless Session-Bean die Annotation @Stateless wie im folgenden Beispiel:
    @Stateless
    @Path("stateless-bean")
    public class StatelessResource {...}
  • Verwenden Sie für eine Singleton-Bean die Annotation @Singleton wie im folgenden Beispiel:
    @Singleton
    @Path("singleton-bean")
    public class SingletonResource {...}
Bei CDI können Sie die Annotationen @ApplicationScoped und @Inject für Beans mit Anwendungsbereich verwenden.
Tipp: Wenn das Feature CDI inaktiviert ist, meldet JAX-RS keine Fehler. Die Instanzen werden jedoch mit POJO abgerufen.
@ApplicationScoped
@Path("/ApplicationScopedResource")
public class ApplicationScopedResource {

    private @Inject
    SimpleBean injected;

...

}

Einschränkungen in JAX-RS 2.0 mit EJB und CDI

Nachfolgend sind die Einschränkungen für JAX-RS 2.0 in Liberty aufgeführt:

  • Wenn Sie EJB als JAX-RS-Ressource, -Provider oder -Anwendung verwenden, können Sie @Context nicht in den Konstruktor der Enterprise JavaBean injizieren. Dies liegt daran, dass die EJB mit Standardkonstruktor nur gemäß der EJB- und der JAX-RS-Spezifikation für JAX-RS verwendet werden kann.
  • Wenn Sie die EJB- oder CDI-Annotation in einer Java-Klasse verwenden, das Liberty-Feature für EJB (z. B. ejbLite-3.2) oder CDI (z. B. cdi-1.0) aber nicht in der Datei server.xml konfiguriert ist, gibt es keine EJB- oder CDI-Unterstützung in der Liberty-Laufzeit, sodass die JAX-RS-2.0-Engine die Java-Klasse als POJO-Klasse verwendet.
  • Wenn eine Anwendungsklasse keine Schnittstelle implementiert oder mit der Annotation @Localbean versehen ist, wird sie als EJB betrachtet. Implementiert die Anwendungsklasse lokale oder POJO-Schnittstellen, wird sie nicht als EJB betrachtet.
    • Provider:
      • Wenn eine Klasse POJO-Providerschnittstellen ausschließlich ohne die Annotation @Local implementiert, wird sie als gültiger EJB-Provider betrachtet.
      • Wenn eine Klasse mit der Annotation @LocalBean versehen ist und die POJO-Providerschnittstelle implementiert, wird sie als gültiger EJB-Provider betrachtet.
      • Wen eine Klasse die lokale Schnittstelle mit der Annotation @Local hat, ist die lokale Schnittstelle eine Providerschnittstelle. Implementiert diese Klasse die Providerschnittstelle, ist sie ein gültiger EJB-Provider.
      • Wen eine Klasse eine lokale Schnittstelle mit der Annotation @Local hat und die lokale Schnittstelle keine Providerschnittstelle ist, ist die Klasse kein gültiger Provider.

        Dies liegt daran, dass der EJB-Container in diesem Fall nur einen EJB-Stub für die lokale Schnittstelle und nicht für die POJO-Providerschnittstelle generieren kann.

      • Wenn eine Klasse nur mit der Annotation @Local versehen ist, die auf eine Providerschnittstelle verweist, diese Providerschnittstelle jedoch nicht implementiert, ist die Klasse gemäß der Spezifikation JAX-RS 2.0 kein gültiger Provider. In der Spezifikation heißt es: Ein Provider ist eine Klasse, die JAX-RS-Schnittstellen implementiert, die in dieser Spezifikation beschrieben sind und zur automatischen Erkennung mit der Annotation @Provider versehen werden können.
    • Ressourcen:
      • Wenn eine EJB-basierte Ressource keine Schnittstelle implementiert, sind alle in dieser Klasse deklarierten Methoden als JAX-RS-Ressourcen verfügbar.
      • Wenn eine EJB-basierte Ressource eine Schnittstelle (lokal oder POJO) implementiert, sind alle in dieser Schnittstelle deklarierten Methoden als JAX-RS-Ressourcen verfügbar.
      • Wenn eine EJB-basierte Ressource mehrere Schnittstellen implementiert,
        1. Wenn alle Schnittstellen POJO-Schnittstellen ohne die Annotation @Local sind, sind alle in der Schnittstelle deklarierten Methoden als JAX-RS-Ressourcen verfügbar.
        2. Wenn alle Schnittstellen lokale Schnittstellen mit der Annotation @Local sind, sind alle in der Schnittstelle deklarierten Methoden als JAX-RS-Ressourcen verfügbar.
        3. Wenn einige Schnittstellen lokale Schnittstellen mit der Annotation @Local sind und eine keine lokalen Schnittstellen sind, sind nur in den lokalen Schnittstellen deklarierte Methoden als JAX-RS-Ressourcen verfügbar. Dies liegt daran, dass der EJB-Container in diesem Szenario nur einen EJB-Stub für lokale Schnittstellen generieren kann.
        4. Wenn die EJB-basierte Ressource mit der Annotation @LocalBean versehen ist, sind alle in der Klasse deklarierten Methoden als JAX-RS-Ressourcen verfügbar.
        5. Wenn eine EJB-basierte Ressource eine Schnittstelle implementiert, muss die JAX-RS-Ressourcenmethode in der Schnittstelle deklariert sein. Ist die Schnittstelle ein Provider, der nicht modifiziert werden kann, müssen Sie eine neue Schnittstelle für die Ressourcenklasse erstellen, um die Ressourcenmethode hinzuzufügen. Andernfalls wird sie nicht als EJB-Ressource betrachtet.
  • Wenn eine Ressourcenklasse mit der Annotation @Path eine JAX-RS-Providerschnittstelle implementiert oder mit der Annotation @Provider deklariert, funktioniert diese Klasse als Ressource und als Provider. Die JAX-RS-2.0-Engine verwendet in diesem Fall standardmäßig nur die Instanz dieser Klasse, die von der Ressource und dem Provider gemeinsam genutzt wird. Der Lebenszyklus der Instanz ist ein Singleton.
  • Wenn eine Klasse in den Methoden getClasses und getSingletons der Anwendungsklasse registriert ist, verwendet die JAX-RS-2.0-Engine standardmäßig die Instanz der Methode getSingletons und ignoriert die Registrierung in der Methode getClasses.
  • Wenn eine REST-konforme Ressource gleichzeitig eine CDI-verwaltete Bean mit dem Bereich javax.enterprise.context.Dependent ist, kann die Methode PreDestroy aufgrund der CDI-Beschränkung nicht aufgerufen werden.

Lebenszyklus von JAX-RS-2.0-Beans und Enterprise JavaBeans

JAX-RS-Beans und Enterprise JavaBeans haben unterschiedliche Lebenszyklen. Wenn der Lebenszyklus von JAX-RS-Beans und Enterprise JavaBeans einen Konflikt erzeugt, wird der Lebenszyklus in Liberty vom EJB-Container so gesteuert, dass die EJB-Instanz angewendet wird, wohingegen der JAX-RS-Lebenszyklus nicht funktioniert. Weitere Informationen finden Sie in der folgenden Tabelle:
Tabelle 1. Lebenszyklus von JAX-RS-2.0-Beans und Enterprise JavaBeans
Anwendung JAX-RS 2.0 EJB Ergebnis
Ressource perRequest Stateless Stateless
  perRequest Singleton Singleton
  Singleton Stateless Stateless
  Singleton Singleton Singleton
Provider Singleton Stateless Stateless
  Singleton Singleton Singleton

Lebenszyklus des Bereichs für JAX-RS 2.0 und für CDI

Beans haben einen Bereich, der den Lebenszyklus seiner Instanzen bestimmt. JAX-RS und CDI haben etwas unterschiedliche Bereiche. Wenn der Bereichslebenszyklus von JAX-RS und CDI einen Konflikt erzeugen, sieht das Ergebnis wie in der folgenden Tabelle angegeben aus:
Tabelle 2. Lebenszyklus des Bereichs für JAX-RS 2.0 und für CDI
Anwendung Bereich für JAX-RS 2.0 Bereichsannotation für CDI Ergebnis
Ressource perRequest @ApplicationScoped Singleton
  perRequest @RequestScoped perRequest
  perRequest @Dependent perRequest
  perRequest @SessionScoped Session
  perRequest   perRequest
  Singleton @ApplicationScoped Singleton
  Singleton @RequestScoped perRequest
  Singleton @Dependent Singleton
  Singleton @SessionScoped Session
  Singleton   Singleton
Provider Singleton @ApplicationScoped Singleton
  Singleton @RequestScoped Singleton
  Singleton @Dependent Singleton
  Singleton @SessionScoped Singleton
  Singleton   Singleton

Nachrichten bei einem Konflikt des Bereichslebenszyklus von JAX-RS 2.0 und CDI

Wenn der Bereichslebenszyklus von JAX-RS 2.0 und CDI einen Konflikt erzeugt, werden die folgenden Warnungen angezeigt, die keine Aktionen erfordern.

  • CWWKW1001W: The scope {1} of JAXRS-2.0 Resource {0} does not match the CDI scope {2}. Liberty gets resource instance from {3}.
    Diese Nachricht wird angezeigt, wenn der JAX-RS-2.0-Ressourcenbereich nicht mit dem CDI-Bereich übereinstimmt und die Ressourceninstanz in CDI vorhanden ist, sodass Liberty die Ressourceninstanz aus CDI abruft. Wenn die Instanz aus JAX-RS stammt, schließt sie keine CDI-Injektion ein.
  • CWWKW1002W: The CDI scope of JAXRS-2.0 Provider {0} is {1}. Liberty gets the provider instance from {2}.
    Diese Nachricht wird angezeigt, weil die Providerinstanz ein Singleton ist. Liberty ruft die Providerinstanz von CDI ab, wenn der Provider den Bereich Dependent oder ApplicationScoped hat. Wenn die Instanz aus JAX-RS stammt, schließt sie keine CDI-Injektion ein.

Symbol das den Typ des Artikels anzeigt. Referenzartikel

Nutzungsbedingungen für Information Center | Feedback


Symbol für Zeitmarke Letzte Aktualisierung: 26.04.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=rwlp_jaxrs2.0_ejbcdi
Dateiname: rwlp_jaxrs2.0_ejbcdi.html