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: 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
- 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
}
}
- 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.
- 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
}
}
- (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.
- (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: Die Injektion von Parametern für JAX-RS-Felder und -Eigenschaften, z. B. von
@javax.ws.rs.QueryParam, wird nicht unterstützt.
sptcfg
- 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.