Implementar recursos JAX-RS con distintos ámbitos de ciclo de vida

Los desarrolladores de aplicaciones puede utilizar JCDI (Java™ Contexts and Dependency Injection) para tener distintos ámbitos para sus beans gestionados. Por ejemplo, si tiene una anotación @javax.enterprise.context.ApplicationScoped en una clase Java denominada Foo y varios campos Foo anotados con @javac.inject.Inject en beans gestionados, sólo hay una instancia Foo a nivel de toda la aplicación que exista realmente.

Acerca de esta tarea

Los ámbitos de ciclo de vida pueden ayudar a los desarrolladores de aplicaciones a gestionar su código. Por ejemplo, si proporciona a los tipos Java una anotación de ámbito simple, puede asegurarse de que se creará una única instancia gestionada para dicho ámbito, en lugar de la posibilidad de tener que escribir varias líneas de código para garantizar el comportamiento que desee.

Los ámbitos de ciclo de vida sólo se aplican a beans gestionados. Si el código de aplicación crea una nueva instancia de una clase, el código controla todo el ciclo de vida de dicha instancia única. Sin embargo, en código gestionado como por ejemplo clases de recursos JAX-RS (API Java para servicios web RESTful) donde el entorno de ejecución crea nuevas instancias automáticamente, el entorno de ejecución de JAX-RS asume la responsabilidad del ciclo de las clases.

Best practice Best practice: Añada ámbitos de ciclo de vida específicos a las clases de proveedor y recurso raíz JAX-RS que existan en la aplicación, en un archivo habilitado para JCDI. Para clases de recursos JAX-RS con una anotación @javax.ws.rs.Path, puede utilizar @javax.enterprise.context.RequestScoped. Para las subclases javax.ws.rs.core.Application y las clases anotadas @javax.ws.rs.ext.Provider, debe utilizar @javax.enterprise.context.ApplicationScoped.bprac

En las instrucciones siguientes se describe cómo puede utilizar los ámbitos de ciclo de vida de una aplicación web habilitada para JCDI simple con JAX-RS:

Procedimiento

  1. Añada un descriptor de despliegue beans.xml a la aplicación web (WAR) en el directorio WEB-INF. La existencia del archivo WEB-INF/beans.xml indica que el archivo es un archivo habilitado para JCDI. No es necesario añadir ninguna información adicional para esta tarea. En el ejemplo siguiente se muestra un archivo WEB-INF/beans.xml básico:
    <?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">
    
    <!-- Expresamente vacío. -->
    
    </beans>
  2. Cree una clase de recurso raíz JAX-RS. En el ejemplo siguiente se muestra una clase de recurso raíz 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. Añada un ámbito de ciclo de vida JCDI a las clases JAX-RS. Añada la anotación de ámbito @javax.enterprise.context.RequestScoped a las clases de recuso raíz:
    Best practice Best practice: Añada la anotación @javax.enterprise.context.RequestScoped a las clases de recurso raíz para asegurarse de que el recurso raíz JAX-RS tenga un nombre de instancia exclusiva por solicitud. Éste es el comportamiento predeterminado en aplicaciones no habilitadas para 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. (opcional) Para las clases anotadas @javax.ws.rs.ext.Provider o las subclases javax.ws.rs.core.Application, debe añadir @javax.enterprise.context.ApplicationScoped a la clase. En el siguiente ejemplo se muestra cómo modificar el proveedor JAX-RS o la subclase de aplicación con una anotación de ámbito @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 {
            /* escribir algo en la secuencia de entidad */
        }
    }

Resultados

Ha configurado una aplicación web para utilizar JCDI y ha creado un proveedor y recurso JAX-RS JCDI que abarca todo el ciclo de vida.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_jcdi_lifecycle
File name: twbs_jaxrs_jcdi_lifecycle.html