Implémentation de ressources JAX-RS avec différentes portées de cycle de vie

Les développeurs d'applications peuvent utiliser JDCI (Java™ Contexts and Dependency Injection) pour avoir différentes portées pour leurs beans gérés. Par exemple, si vous avez une annotation @javax.enterprise.context.ApplicationScoped sur une classe Java nommée Foo et plusieurs zones Foo annotées avec @javac.inject.Inject dans des beans gérés, il n'existe effectivement qu'une seule instance Foo de portée application.

Pourquoi et quand exécuter cette tâche

Les portées de cycle de vie peuvent aider les développeurs d'applications à gérer leur code. Par exemple, en attribuant à des types Java une annotation de portée simple, vous pouvez faire en sorte qu'une seule instance gérée soit créée pour cette portée au lieu de devoir potentiellement écrire plusieurs lignes de code pour garantir le comportement souhaité.

Les portées de cycle de vie s'appliquent uniquement aux beans gérés. Si votre code d'application crée une nouvelle instance d'une classe, votre code contrôle la totalité du cycle de vie de cette instance unique. Toutefois, dans un code géré tel que des classe de ressources JAX-R (Java API for RESTful Web Services) dans lequel l'environnement d'exécution crée pour vous de nouvelles instances, l'environnement d'exécution JAX-RS est responsable du cycle de vie de vos classes.

Pratiques recommandées Pratiques recommandées: Ajoutez des portées de cycle de vie spécifiques à toutes les classes de ressources et de fournisseur racine JAX-RS existant dans votre application, dans une archive compatible JCDI. Pour une classe de ressources JAX-RS avec une annotation @javax.ws.rs.Path, vous pouvez utiliser @javax.enterprise.context.RequestScoped. Pour des sous-classes javax.ws.rs.core.Application et des classes annotées @javax.ws.rs.ext.Provider, vous devez utiliser @javax.enterprise.context.ApplicationScoped.bprac

Les instructions suivantes expliquent comment utiliser des portées de cycle de vie pour une application Web compatible JCDI simple avec JAX-RS :

Procédure

  1. Ajoutez un descripteur de déploiement beans.xml à votre fichier WAR d'application Web dans le répertoire WEB-INF. L'existence du fichier WEB-INF/beans.xml indique que l'archive est une archive JCDI. Vous n'avez pas besoin d'y ajouter des informations supplémentaires pour cette tâche. L'exemple suivant illustre un fichier WEB-INF/beans.xml de base :
    <?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">
    
    <!-- Vide exprès. -->
    
    </beans>
  2. Créez une classe de ressources racine JAX-RS. L'exemple suivant illustre une classe de ressources racine JAX-RS simple :
    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. Ajoutez une portée de cycle de vie JCDI à vos classes JAX-RS. Ajoutez l'annotation de portée @javax.enterprise.context.RequestScoped à vos classes de ressources racine :
    Pratiques recommandées Pratiques recommandées: Ajoutez l'annotation @javax.enterprise.context.RequestScoped à vos classes de ressources racine pour faire en sorte que votre classe de ressources racine JAX-RS n'ait qu'une seule instance par demande. Il s'agit du comportement par défaut dans les applications non JCDI.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. (Facultatif) Pour les classes annotées @javax.ws.rs.ext.Provider personnalisées ou les sous-classes javax.ws.rs.core.Application, vous devez ajouter @javax.enterprise.context.ApplicationScoped à votre classe. L'exemple suivant montre comment modifier votre sous-classe de fournisseur ou d'application JAX-RS avec une annotation de portée @javax.enterprise.context.ApplicationScoped :
    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 {
            /* écrire quelque chose pour le flux d'entité */
        }
    }

Résultats

Vous avez configuré une application Web pour utiliser JCDI, et créé une ressource ainsi qu'un fournisseur JAX-RS avec une portée de cycle de vie JDCI.


Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_jcdi_lifecycle
Nom du fichier : twbs_jaxrs_jcdi_lifecycle.html