Implemente Recursos JAX-RS com Diferentes Escopos de Ciclos de Vida

Os desenvolvedores de aplicativos podem usar o Java™ Contexts and Dependency Injection (JCDI) para ter diferentes escopos de seus beans gerenciados. Por exemplo, se você tiver uma anotação @javax.enterprise.context.ApplicationScoped em uma classe Java denominada Foo e diversos campos Foo anotados para @javac.inject.Inject em beans gerenciados, haverá apenas uma instância Foo com escopo no aplicativo que realmente existe.

Sobre Esta Tarefa

Escopos de ciclo de vida podem ajudar os desenvolvedores de aplicativos a gerenciar seu código. Por exemplo, ao fornecer aos tipos Java uma anotação de escopo simples, é possível assegurar que uma instância seja criada para esse escopo, em vez de ter de potencialmente escrever diversas linhas de código para garantir o comportamento que você deseja.

Os escopos de ciclo de vida apenas se aplicam a beans gerenciados. Se o seu código do aplicativo criar uma nova instância de uma classe, o seu código controla o ciclo de vida inteiro dessa única instância. Porém, em código gerenciado como classes de recurso Java API for RESTful Web Services (JAX-RS) em que o ambiente de tempo de execução cria novas instâncias para você, o ambiente de tempo de execução JAX-RS assume a responsabilidade pelo ciclo de vida das suas classes.

Boas Práticas Boas Práticas: Inclua escopos de ciclo de vida específicos em qualquer recurso raiz JAX-RS e classes do provedor que existam no seu aplicativo, em um archive ativado para JCDI. Para classes de recurso JAX-RS com uma anotação @javax.ws.rs.Path, é possível usar @javax.enterprise.context.RequestScoped. Para subclasses javax.ws.rs.core.Application e classes anotadas @javax.ws.rs.ext.Provider, você deve usar @javax.enterprise.context.ApplicationScoped.bprac

As instruções a seguir descrevem como usar escopos de ciclo de vida para um aplicativo da Web ativado para JCDI simples com JAX-RS:

Procedimento

  1. Inclua um descritor de implementação beans.xml no seu web application (WAR) no diretório WEB-INF. A existência do arquivo WEB-INF/beans.xml indica que o archive é um archive ativado para JCDI. Você não é solicitado a incluir nenhuma informação adicional para essa tarefa. O exemplo a seguir ilustra uma arquivo 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">
    
    <!-- Isso está vazio de propósito. -->
    
    </beans>
  2. Crie uma classe de recurso raiz JAX-RS. O exemplo a seguir ilustra uma classe de recurso raiz JAX-RS:
    pacote 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. Inclua um escopo de ciclo de vida JCDI nas suas classes JAX-RS. Inclua a anotação de escopo @javax.enterprise.context.RequestScoped em suas classes de recurso raiz:
    Boas Práticas Boas Práticas: Inclua a anotação @javax.enterprise.context.RequestScoped em suas classes de recurso raiz para garantir que a sua classe de recurso raiz JAX-RS tem uma instância única por pedido. Esse é o comportamento padrão em aplicativos não ativados para JCDI.bprac
    pacote 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 quaisquer classes anotadas @javax.ws.rs.ext.Provider customizadas ou subclasses javax.ws.rs.core.Application, você deve incluir @javax.enterprise.context.ApplicationScoped na sua classe. O exemplo a seguir ilustra como modificar o seu provedor JAX-RS ou subclasse do aplicativo com uma anotação de escopo @javax.enterprise.context.ApplicationScoped:
    pacote 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 {
            /* gravar alguma coisa no fluxo da entidade */
        }
    }

Resultados

Você configurou um aplicativo da Web para usar o JCDI, e criou um provedor e recurso JAX-RS com escopo de ciclo de vida, JCDI.


Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_jcdi_lifecycle
Nome do arquivo: twbs_jaxrs_jcdi_lifecycle.html