REST-Sichten einer EJB ohne Schnittstelle implementieren

Wenn Sie mit EJB-Anwendungen (Enterprise JavaBeans) arbeiten, die in einer Sicht ohne Schnittstelle zugänglich sind, können Sie über JAX-RS (Java™ API for RESTful Web Services) eine RESTful-Schnittstelle für die Enterprise-Bean verfügbar machen. Durch die Implementierung von Enterprise-Beans mit JAX-RS-Annotationen behalten Sie die EJB-Funktionen bei, einschließlich Transaktionsunterstützung, Injektion von Java-EE-Komponenten und -Ressourcen sowie EJB-Session-Bean-Funktionen.

Vorbereitende Schritte

Bis EJB Version 3.1 benötigten Enterprise-Beans, die eine lokale EJB-Clientsicht erforderten, auch eine separate Java-Schnittstelle. Diese Schnittstelle war in der Regel in einer gesonderten Datei enthalten, in der die Methoden für die lokale Sicht deklariert waren. Die Enterprise-Bean gibt an, dass die Schnittstelle für die lokale EJB-Sicht mithilfe von Implementierungsdeskriptoren oder EJB-Annotationen implementiert wurde.

Wenn Sie die Spezifikation EJB 3.1 verwenden, haben Sie die Möglichkeit, eine lokale Sicht einer Enterprise-Bean ohne einer expliziten lokalen EJB-Schnittstelle bereitzustellen. Stattdessen hat die Enterprise-Bean eine Clientsicht ohne Schnittstelle, die auf den öffentlichen Methoden Ihrer Beanklasse basiert. Die Entwicklung von Enterprise-Beans mit einer Sicht ohne Schnittstelle kann aus den folgenden Gründen einfacher sein als die Entwicklung von Enterprise-Beans mit einer lokalen Sicht:
  • Enterprise-Beans mit einer Sicht ohne Schnittstelle erfordern keine separate Java-Schnittstellendeklaration.
  • Enterprise-Beans mit einer Sicht ohne Schnittstelle erfordern keine Angabe zusätzlicher Metadaten im Implementierungsdeskriptor oder bei der Verwendung von EJB-Annotationen.
Weitere Einzelheiten zu Sichten einer Enterprise-Bean ohne Schnittstelle finden Sie in der Spezifikation EJB 3.1.

JAX-RS unterstützt die Verwendung von Enterprise-Beans, die eine lokale Geschäftsschnittstelle deklarieren, und die Verwendung von Enterprise-Beans mit Sichten ohne Schnittstelle.

Bewährtes Verfahren Bewährtes Verfahren: Obwohl Sie Enterprise-Beans auf verschiedene Arten deklarieren können, empfiehlt es sich, die lokale EJB-Geschäftsschnittstelle direkt zu implementieren und die Annotation "@javax.ejb.Local" immer zu deklarieren. Bei der Verwendung dieser Methode muss die EJB-Bean die lokale Geschäftsschnittstelle implementieren, die Fehler bei der Eingabe von Methodennamen und Änderungen von Argumenttypen verhindert. Wenn Sie immer die Annotation "@javax.ejb.Local" verwenden und mehrere Geschäftsschnittstellen vorhanden sind, können Sie die Geschäftsschnittstelle einfach dem Annotationswert hinzufügen. Sie können diesen Ansatz auch verwenden, um die Enterprise-Bean mithilfe eines Implementierungsdeskriptors zu ändern.bprac

In dieser Task ist die Implementierung von REST-Sichten für Enterprise-Bean-Sichten ohne Schnittstelle beschrieben.

Informationen zu diesem Vorgang

Sie können eine einfache Enterprise-Bean mit JAX-RS-Annotationen erstellen. In dieser Task geht es speziell um die Implementierung von REST-Sichten für eine Enterprise-Bean-Sicht ohne Schnittstelle. Dennoch ist es wichtig, dass Sie Ihre Anwendungsarchitektur in vollem Umfang berücksichtigen. Wenn Sie sich für ein bestimmtes Ressourcenmodell entscheiden und bestimmen, welche REST-Sichten für Ihre Enterprise-Bean-Anwendung infrage kommen, müssen Sie bedenken, wie Ressourcen verfügbar gemacht werden sollen. Diese Überlegungen sprengen jedoch den Rahmen dieser Task.

JAX-RS unterstützt Stateless- und Singleton-Session-Beans. Sie können der lokalen Schnittstelle einer Session-Bean JAX-RS-Annotationen hinzufügen. Außerdem können Sie mit EJB 3.1 JAX-RS-Annotationen einer EJB-Klasse direkt hinzufügen, wenn die Enterprise-Bean eine Sicht ohne Schnittstelle bereitstellt.

Mit den Packregeln der Spezifikation EJB 3.1 können Sie JAX-RS-Enterprise-Beans der WAR-Datei direkt im Verzeichnis "WEB-INF/classes" oder über eine JAR-Datei im Verzeichnis "WEB-INF/lib" hinzufügen. Sie können eine Enterprise-Bean mit Annotationen und/oder mit einem EJB-Implementierungsdeskriptor deklarieren.

JAX-RS-Enterprise-Beans mit Annotationen in einer eigenständigen Datei oder in einer EJB-JAR-Datei, die in einer EAR-Datei enthalten ist, werden nicht unterstützt.

Vorgehensweise

  1. Erstellen Sie eine Enterprise-Bean. Im folgenden Beispiel gibt es eine einfache EJB-Klasse mit der Bezeichnung Organization. Diese Klasse profitiert von dem in der Spezifikation EJB 3.1 eingeführten Klassenfeature für Sichten ohne Schnittstelle.
    public class Organization {
        public String getInformation() {
            // Informationen mittels Zeichenfolge zurückgeben
        }
    }
  2. Führen Sie einen der folgenden Schritte aus, um eine Enterprise-Bean als JAX-RS-Ressource zu präsentieren:
    • Ändern Sie in der Implementierungsdeskriptordatei WEB-INF/ejb-jar.xml Ihrer Enterprise-Bean die normalen JAX-RS-Java-Klassen in JAX-RS-fähige Enterprise-Beans. Sie könnten beispielsweise das folgende Codefragment zum Implementierungsdeskriptor WEB-INF/ejb-jar.xml hinzufügen:
      <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
      <!--
          Diese Datei muss im Verzeichnis WEB-INF/ Ihrer WAR-Datei vorhanden sein.
          Weitere Einzelheiten finden Sie in der Spezifikation EJB 3.1 (20.4).
      -->
          	<enterprise-beans>
              <session>
                  <ejb-name>Organization</ejb-name>
                  <ejb-class>com.example.jaxrs.Organization</ejb-class>
                  <session-type>Stateless</session-type>
              		</session>
          </enterprise-beans>
      </ejb-jar>

      Falls Sie aus der Enterprise-Bean mit dem Implementierungsdeskriptor eine Singleton-Bean machen möchten, verwenden Sie <session-type>Singleton</ session-type> anstelle von <session-type>Stateless</session-type>.

    • Fügen Sie zur Java-Klasse Ihrer Enterprise-Bean die Annotation @javax.ejb.Stateless hinzu. Das folgende Beispiel zeigt eine einfache JAX-RS-Enterprise-Bean mit Annotation:
      package com.example.jaxrs;
      @javax.ejb.Stateless
      @javax.ws.rs.Path("/organization/")
      public class Organization {
      
          @javax.ws.rs.GET
          @javax.ws.rs.Produces("text/plain")
          public String getInformation() {
              // Informationen mittels Zeichenfolge zurückgeben
          }
      }

      Falls Sie aus der Enterprise-Bean mit Annotationen eine Singleton-Bean machen möchten, verwenden Sie die EJB-3.1-Annotation @javax.ejb.Singleton anstelle der Annotation @javax.ejb.Stateless.

  3. Fügen Sie zu den Methoden, die der Enterprise-Bean als REST-Schnittstelle zur Verfügung gestellt werden sollen, JAX-RS-Annotationen hinzu. Das folgende Beispiel veranschaulicht das Hinzufügen von JAX-RS-Annotationen zur Enterprise-Bean @javax.ejb.Stateless.
    package com.example.jaxrs;
    
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // Informationen mittels Zeichenfolge zurückgeben
        }
    }
  4. (Optional) Fügen Sie Ihren JAX-RS-EJB-Klassen mit @javax.annotation.Resource annotierte Java-EE-Ressourcenfelder und -Eigenschaften hinzu, um ohne großen Aufwand auf Ressourcen in Ihrer Anwendung zuzugreifen. Die Java-EE-Injektionen funktionieren nicht in einfachen Java-Klassen mit JAX-RS-Annotationen. Die Injektion von mit @javax.annotation.Resource annotierten Java-EE-Ressourcenfeldern und -Eigenschaften in Ihre JAX-RS-EJB-Klassen funktioniert nur, wenn Ihre mit JAX-RS annotierten Klassen eine Enterprise-Bean oder eine JCDI-verwaltete (Java Context and Dependency Injection, JSR-299) Bean sind, z. B.:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.annotation.Resource(name="jdcb/TestDataSource")
        private javax.sql.DataSource datasource;
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // Lesen der Datenquelle
            // Informationen mittels Zeichenfolge zurückgeben
        }
    }
    Wenn eine Datenquelle ordnungsgemäß und mit dem richtigen JNDI-Namen konfiguriert ist, wird in diesem Beispiel ein DataSource-Objekt in die Ressourcenklasse eingefügt.
  5. (Optional) Verwenden Sie die JAX-RS-Injektion @javax.ws.rs.core.Context, damit Sie auf Informationen zur Anforderung zugreifen können. Sie können ein UriInfo-Feld für @javax.ws.rs.core.Context zu Ihrer JAX-RS-EJB-Klasse hinzufügen, um auf Informationen zum Anforderung-URI zuzugreifen. Beispiel:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.ws.rs.core.Context
        private UriInfo uriInfo;
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // Informationen mittels Zeichenfolge zurückgeben
        }
    }
    Wenn Sie Parameter der Anforderung lesen möchten, z. B. @javax.ws.rs.HeaderParam, @javax.ws.rs.QueryParam und @javax.ws.rs.PathParam, fügen Sie einen Parameter zu Ihrer Ressourcenmethode hinzu. Beispiel:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation(@javax.ws.rs.QueryParam("page") String page) {
            /* QueryParam wird in der Liste der Methodenparameter ordnungsgemäß gesetzt. */
            // Informationen mittels Zeichenfolge zurückgeben
        }
    
        /* Das folgende Feld wird nicht gesetzt. */
        @javax.ws.rs.QueryParam("q")
        private String willNotWork;
    
        @javax.ws.rs.QueryParam("q")
        public void setMyQueryParam(String q) {
            /* Diese Eigenschaft wird nicht gesetzt. */
        }
    }
    Unterstützte Konfigurationen Unterstützte Konfigurationen: Die Injektion von Parametern für JAX-RS-Felder und -Eigenschaften, z. B. von @javax.ws.rs.QueryParam, wird nicht unterstützt. sptcfg
  6. Fügen Sie die EJB-Klasse zum Verzeichnis WEB-INF/classes Ihrer WAR-Datei oder zu einer im Verzeichnis WEB-INF/lib enthaltenen JAR-Datei hinzu. Wenn ein Client eine Anforderung an eine Enterprise-Bean mit JAX-RS-Annotation sendet, sucht die JAX-RS-Laufzeitumgebung nach einer EJB-Instanz der Klasse und verwendet diese zum Aufrufen der Ressourcenmethode.

Ergebnisse

Sie haben für eine vorhandene Enterprise-Bean mit Sicht ohne Schnittstelle die Bereitstellung und Nutzung von JAX-RS-Ressourcen aktiviert.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_ejb_nointerface
Dateiname:twbs_jaxrs_ejb_nointerface.html