Implemente Recursos JAX-RS com Injeção de Dependência

O Java™ Contexts and Dependency Injection (JCDI) suporta injeção de dependência em beans gerenciados. Ao configurar o seu aplicativo da Web para ser ativado para JCDI, é possível incluir campos e propriedades anotados @javax.inject.Inject. Se os campos e propriedades anotados são pontos de injeção válidos com beans gerenciados JCDI, então suas dependências serão resolvidas durante o tempo de execução. A injeção de dependência separa a criação de novas instâncias de tipos Java a partir do uso desses tipos Java no código. A injeção de dependência permite código mais facilmente testável, enquanto também melhora a capacidade de gerenciar aplicativos.

Sobre Esta Tarefa

Nessa tarefa, você configura o seu aplicativo para usar o JCDI, incluindo um descritor de implementação beans.xml. Depois, você cria um tipo de recurso Java API for RESTful Web Services (JAX-RS) padrão com um campo @javax.inject.Inject, o que será resolvido durante o tempo de execução.

As instruções a seguir descrevem como é possível criar 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. Isso indica que o aplicativo da Web deve ser um aplicativo ativado para JCDI. 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 no descritor de implementação 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:
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithInjection")
    public class StringResource {
        public StringResource() {
            /* use a no-argument constructor */
        }
    
        @javax.ws.rs.core.Context
        private javax.ws.rs.core.HttpHeaders httpHeaders;
    
        @javax.annotation.PostConstruct
        private void myPostConstruct() {
            /* leia de httpHeaders se necessário */
        }
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }

    No código anterior, foi usado um construtor sem argumento. Um construtor sem argumento é um construtor JCDI válido, que torna a classe um bean JCDI válido. Se desejar injetar objetos de contexto ou parâmetros JAX-RS durante a instanciação do objeto, é possível usar propriedades ou campos de bean. Então use um método anotado @javax.annotation.PostConstruct, que é chamado após o objeto ser construído.

  3. Inclua um escopo de ciclo de vida JCDI nas suas classes JAX-RS. O seguinte exemplo ilustra uma classe de recurso raiz JAX-RS com uma anotação de escopo @javax.enterprise.context.RequestScoped:
    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
    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. Crie uma classe que é injetada no recurso raiz JAX-RS. O exemplo a seguir ilustra uma classe Java padrão:
    package com.example.jaxrs;
    
    public class Data {
        public String getData() {
            return "Hello world!";
        }
    }
  5. Modifique o seu recurso raiz JAX-RS para incluir um campo anotado @javax.inject.Inject para o tipo com.example.jaxrs.Data. O seguinte exemplo ilustra uma classe de recurso raiz JAX-RS modificada com um ponto de injeção @javax.inject.Inject:
    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;
    }

    Durante o tempo de execução, quando o recurso raiz JAX-RS é construído, uma instância do tipo Data é injetada no campo myData. Enquanto essa é uma forma simples de injeção, o JCDI permite casos de uso mais complexos. Consulte a especificação JCDI para obter detalhes adicionais.

  6. Inclua um arquivo web.xml do Servlet 3.0 no seu arquivo WAR. No exemplo a seguir, a definição de servlet de aplicativo JAX-RS é incluída, o que torna todos os recursos raiz JAX-RS disponíveis no padrão de URL /rest/*:
    <?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>

Resultados

Você configurou um aplicativo da Web para usar o JCDI, criou um recurso JAX-RS com escopo definido de ciclo de vida do JCDI, e criou um ponto de injeção padrão.


Í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_depinjection
Nome do arquivo: twbs_jaxrs_jcdi_depinjection.html