JAX-RS-Ressourcen mit verschiedenen Lebenszyklusbereichen implementieren

Anwendungsentwickler können Java™ Contexts and Dependency Injection (JCDI) mit verschiedenen Bereichen für ihre verwalteten Beans verwenden. Wenn Sie beispielsweise eine Annotation @javax.enterprise.context.ApplicationScoped in einer Java-Klasse mit dem Namen Foo und mehrere mit @javac.inject.Inject annotierte Felder Foo in verwalteten Beans haben, gibt es nur einzige anwendungsbezogene Instanz von Foo, die tatsächlich vorhanden ist.

Informationen zu diesem Vorgang

Lebenszyklusebenen können Anwendungsentwickler bei der Verwaltung ihres Codes helfen. Indem Sie beispielsweise Java-Typen eine einfache Bereichsannotation zuordnen, können Sie sicherstellen, dass eine einzige verwaltete Instanz für diesen Bereich erstellt wird, anstatt unter Umständen mehrere Zeilen von Code schreiben zu müssen, die das gewünschte Verhalten gewährleisten.

Lebenszyklusbereiche gelten nur für verwaltete Beans. Wenn Ihr Anwendungscode eine neue Instanz einer Klasse erstellt, steuert Ihr Code den gesamten Lebenszyklus dieser einzigen Instanz. In verwaltetem Code, wie z. B. JAX-RS-Ressourcenklassen (Java API for RESTful Web Services), in dem die Laufzeitumgebung neue Instanzen für Sie erstellt, übernimmt die JAX-RS-Laufzeitumgebung jedoch die Verantwortung für den Lebenszyklus Ihrer Klassen.

Bewährtes Verfahren Bewährtes Verfahren: Fügen Sie allen JAX-RS-Stammressourcen- und -Providerklassen in Ihrer Anwendung in einem Archiv, das JCDI unterstützt, spezielle Lebenszyklusbereiche hinzu. Für JAX-RS-Ressourcenklassen mit einer Annotation @javax.ws.rs.Path können Sie @javax.enterprise.context.RequestScoped verwenden. Für javax.ws.rs.core.Application-Unterklassen und mit @javax.ws.rs.ext.Provider annotierte Klassen müssen Sie @javax.enterprise.context.ApplicationScoped verwenden.bprac

Die folgenden Anweisungen beschreiben, wie Sie Lebenszyklusbereiche für eine einfache Webanwendung, die JCDI unterstützt, mit JAX-RS verwenden:

Vorgehensweise

  1. Fügen Sie Ihrer Webanwendung (WAR-Datei) im Verzeichnis WEB-INF einen Implementierungsdeskriptor beans.xml hinzu. Das Vorhandensein der Datei WEB-INF/beans.xml zeigt an, dass es sich bei dem Archiv um ein Archiv handelt, das JCDI unterstützt. Für diese Task müssen Sie keine weiteren Informationen hinzufügen. Das folgende Beispiel veranschaulicht eine Basisdatei WEB-INF/beans.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
    XMLSchema-instance" xsi:schemeLocation="http://java.sun.com/xml/ns/javaee http:/
    /java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    
    <!-- Absichtlich leer. -->
    
    </beans>
  2. Erstellen Sie eine JAX-RS-Stammressourcenklasse. Das folgende Beispiel veranschaulicht eine einfache JAX-RS-Stammressourcenklasse:
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithLifecycle")
    public class StringResource {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }
  3. Fügen Sie Ihren JAX-RS-Klassen einen JCDI-Lebenszyklusbereich hinzu. Fügen Sie Ihren Stammressourcenklassen die Bereichsannotation @javax.enterprise.context.RequestScoped hinzu:
    Bewährtes Verfahren Bewährtes Verfahren: Fügen Sie Ihren Stammressourcenklassen die Annotation @javax.enterprise.context.RequestScoped hinzu, um sicherzustellen, dass Ihre JAX-RS-Stammressourcenklasse eine eindeutige Instanz pro Anforderung hat. Dies ist das Standardverhalten in Anwendungen, die JCDI nicht unterstützen.bprac
    package com.example.jaxrs;
    
    @javax.enterprise.context.RequestScoped
    @javax.ws.rs.Path("exampleWithLifecycle")
    public class StringResource {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }
  4. (Optional) Für alle angepassten mit @javax.ws.rs.ext.Provider annotierten Klassen oder für javax.ws.rs.core.Application-Unterklassen müssen Sie Ihrer Klasse @javax.enterprise.context.ApplicationScoped hinzufügen. Das folgende Beispiel veranschaulicht, wie Sie Ihren JAX-RS-Provider oder Ihre Anwendungsunterklasse mit einer Bereichsannotation @javax.enterprise.context.ApplicationScoped ändern:
    package com.example.jaxrs;
    
    @javax.enterprise.context.ApplicationScoped
    @javax.ws.rs.ext.Provider
    public class Example implements javax.ws.rs.ext.MessageBodyWriter<CustomType> {
    
        public long getSize(String t,
                            Class<?> type,
                            Type genericType, 
                            Annotation[] annotations, 
                            javax.ws.rs.core.MediaType mediaType) {
            return -1;
        }
    
        public boolean isWriteable(Class<?> type,
                                   Type genericType, 
                                   Annotation[] annotations, 
                                   javax.ws.rs.core.MediaType mediaType) {
            return CustomType.class == type;
        }
    
        public void writeTo(String t,
                            Class<?> type,
                            Type genericType, 
                            Annotation[] annotations, 
                            javax.ws.rs.core.MediaType mediaType,
                            javax.ws.rs.core.MultivaluedMap<String, Object> httpHeaders,
                            OutputStream entityStream) throws IOException {
            /* Daten in den Entitätsdatenstrom schreiben */
        }
    }

Ergebnisse

Sie haben eine Webanwendung für die Verwendung von JCDI konfiguriert, und Sie haben eine JAX-RS-Ressource und einen JAX-RS-Provider mit einem JCDI-Lebenszyklusbereich erstellt.


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_jcdi_lifecycle
Dateiname:twbs_jaxrs_jcdi_lifecycle.html