JAX-RS-Ressourcen mit Abhängigkeitsinjektion implementieren

Java™ Contexts and Dependency Injection (JCDI) unterstützt die Abhängigkeitsinjektion in Managed Beans. Wenn Sie JCDI in Ihrer Webanwendung konfigurieren, können Sie mit @javax.inject.Inject annotierte Felder und Eigenschaften hinzufügen. Wenn die annotierten Felder und Eigenschaften gültige Injektionspunkte sind, werden ihre Abhängigkeiten zur Laufzeit aufgelöst. Die Abhängigkeitsinjektion trennt die Erstellung neuer Instanzen von Java-Typen von der Verwendung dieser Java-Typen im Code. Die Abhängigkeitsinjektion kann die Testfähigkeit von Code erhöhen und gleichzeitig die Verwaltung von Anwendungen vereinfachen.

Informationen zu diesem Vorgang

In dieser Task konfigurieren Sie Ihre Anwendung für die Verwendung von JCDI, indem Sie einen Implementierungsdeskriptor beans.xml hinzufügen. Anschließend erstellen Sie einen Standard-JAX-RS-Ressourcentyp (Java API for RESTful Web Services) mit einem Feld @javax.inject.Inject, das zur Laufzeit aufgelöst wird.

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

Vorgehensweise

  1. Fügen Sie Ihrer Webanwendung (WAR-Datei) im Verzeichnis WEB-INF einen Implementierungsdeskriptor beans.xml hinzu. Damit wird angezeigt, dass die Webanwendung JCDI unterstützt. 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 dem Implementierungsdeskriptor 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("exampleWithInjection")
    public class StringResource {
        public StringResource() {
            /* Konstruktor ohne Argument verwenden */
        }
    
        @javax.ws.rs.core.Context
        private javax.ws.rs.core.HttpHeaders httpHeaders;
    
        @javax.annotation.PostConstruct
        private void myPostConstruct() {
            /* Sofern erforderlich, aus den HTTP-Headern lesen */
        }
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }

    Im vorherigen Code wurde ein Konstruktor ohne Argument verwendet. Ein Konstruktor ohne Argument ist ein gültiger JCDI-Konstruktor, der aus der Klasse eine gültige JCDI-Bean macht. Wenn Sie während der Objektinstanziierung JAX-RS-Kontextobjekte oder -Parameter injizieren möchten, können Sie Beaneigenschaften oder -felder verwenden. Verwenden Sie anschließend eine mit @javax.annotation.PostConstruct annotierte Methode, die nach der Erstellung des Objekts aufgerufen wird.

  3. Fügen Sie Ihren JAX-RS-Klassen einen JCDI-Lebenszyklusbereich hinzu. Das folgende Beispiel veranschaulicht eine einfache JAX-RS-Stammressourcenklasse mit einer Annotation @javax.enterprise.context.RequestScoped:
    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.ws.rs.Path("exampleWithInjection")
    @javax.enterprise.context.RequestScoped
    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. Erstellen Sie eine Klasse, die in die JAX-RS-Stammressource injiziert wird. Das folgende Beispiel veranschaulicht eine Standard-Java-Klasse:
    package com.example.jaxrs;
    
    public class Data {
        public String getData() {
            return "Hello world!";
        }
    }
  5. Ändern Sie Ihre JAX-RS-Stammressource, und fügen Sie ihr ein mit @javax.inject.Inject annotiertes Feld für den Typ com.example.jaxrs.Data hinzu. Das folgende Beispiel veranschaulicht eine geänderte JAX-RS-Stammressourcenklasse mit einem @javax.inject.Inject-Injektionspunkt:
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithInjection")
    @javax.enterprise.context.RequestScoped
    public class StringResource {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return myData.getData();
        }
    
        @javax.inject.Inject
        private Data myData;
    }

    Zur Laufzeit wird bei der Erstellung der JAX-RS-Stammressource eine Instanz des Typs Data in das Feld myData injiziert. Dies ist nur ein einfaches Beispiel für Injektion, aber JCDI unterstützt auch wesentlich komplexere Anwendungsfälle. Weitere Einzelheiten finden Sie in der JCDI-Spezifikation.

  6. Fügen Sie Ihrer WAR-Datei eine Datei web.xml der Servlet Version 3.0 hinzu. Im folgenden Beispiel wird eine JAX-RS-Standardanwendungsservletdefinition hinzugefügt, die alle JAX-RS-Stammressourcen unter dem URL-Muster /rest/* verfügbar macht:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/
    j2ee/web-app_3_0.xsd" version="3.0">
        	<servlet>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
            <load-on-startup>1</load-on-startup>
        	</servlet>
        	<servlet-mapping>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        	</servlet-mapping>
    </web-app>

Ergebnisse

Sie haben eine Webanwendung für die Verwendung von JCDI konfiguriert, eine JAX-RS-Ressource mit JCDI-Lebenszyklus und einen Standardinjektionspunkt 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_depinjection
Dateiname:twbs_jaxrs_jcdi_depinjection.html