Implementando Visualizações RESTful de um EJB Sem Interface

Se você tiver aplicativos Enterprise JavaBeans (EJB) que são expostos usando uma visualização sem interface, é possível expor uma interface RESTful ao enterprise bean usando Java™ API for RESTful Web Services (JAX-RS). Ao implementar enterprise beans anotados do JAX-RS, você mantém a funcionalidade do EJB incluindo suporte a transações, injeção de componentes e recursos Java EE, e outros recursos de bean de sessão do EJB.

Antes de Iniciar

Antes do EJB 3.1, os enterprise beans que necessitavam de uma visualização de cliente local do EJB também precisavam de uma interface Java separada, geralmente localizada em um arquivo separado, que declarava os métodos de visualização locais. O enterprise bean especificava que implementou a interface de visualização local do EJB usando descritores de implementação ou anotações EJB.

Usando a especificação EJB 3.1, você tem a opção de expor uma visualização local de um enterprise bean sem uma interface local do EJB explícita. Em vez disso, o enterprise bean tem uma visualização de cliente sem interface que se baseia nos métodos públicos da sua classe de bean. Enterprise beans de visualização sem interface podem ser mais simples de desenvolver do que um enterprise bean de visualização local pelas seguintes razões:
  • Enterprise beans de visualização sem interface não necessitam de uma declaração de interface Java separada.
  • Enterprise beans de visualização sem interface não precisam especificar metadados adicionais no descritor de implementação ou quando usar anotações EJB.
Consulte a especificação EJB 3.1 para obter detalhes adicionais sobre as visualizações sem interface de um enterprise bean.

O JAX-RS suporta o uso de enterprise beans que declaram uma interface de negócios local e enterprise beans com visualização sem interface.

Boas Práticas Boas Práticas: Apesar de você poder declarar enterprise beans de diferentes maneiras, uma boa prática é implementar diretamente a interface local de negócios do EJB e sempre declarar a anotação @javax.ejb.Local. Ao usar esse método, o bean do EJB é necessário para implementar a interface de negócios local, o que elimina erros de digitação nos nomes de método e nas mudanças para tipos de argumento. Ao usar sempre a anotação @javax.ejb.Local, se houver diversas interfaces de negócios sempre, é possível simplesmente incluir a interface de negócios no valor da anotação. Também é possível usar essa abordagem para modificar o enterprise bean usando um descritor de implementação.bprac

Essa tarefa descreve a implementação de visualizações RESTful de um enterprise bean com visualização sem interface.

Sobre Esta Tarefa

É possível criar um enterprise bean simples com anotações JAX-RS. Apesar de essa tarefa descrever especificamente como implementar visualizações RESTful de um enterprise bean com visualização sem interface, é importante que você considere o escopo completo da arquitetura do seu aplicativo e como deseja expor recursos ao decidir o seu modelo de recurso e determinar quais visualizações RESTful são apropriadas para o seu aplicativo enterprise beans. Essas considerações estão além do escopo dessa tarefa.

O JAX-RS suporta beans de sessão stateless e singleton. É possível incluir anotações JAX-RS na interface local de um bean de sessão. Também, com o EJB 3.1, é possível incluir anotações JAX-RS diretamente em uma classe EJB se o enterprise bean expor uma visualização sem interface.

Com as regras de compactação do EJB 3.1, é possível incluir enterprise beans JAX-RS no arquivo web application archive (WAR) tanto diretamente no diretório WEB-INF/classes quanto usando um arquivo Java archive (JAR) no diretório WEB-INF/lib. É possível declarar um enterprise bean usando anotações, ou usando um descritor de implementação EJB, ou usando ambos, anotações e um descritor de implementação.

Enterprise beans anotados do JAX-RS em um arquivo independente ou em um arquivo ejb-jar separado que está incluído em um EAR não são suportados.

Procedimento

  1. Crie um enterprise bean. No exemplo a seguir, existe uma classe EJB simples chamada Organization. Essa classe tira vantagem do recurso de classe de visualização sem interface introduzido na especificação EJB 3.1.
    public class Organization {
        public String getInformation() {
            // retornar informações por meio de uma Sequência
        }
    }
  2. Para expor um enterprise bean como um recurso JAX-RS, conclua uma das seguintes etapas:
    • No arquivo do descritor de implementação WEB-INF/ ejb-jar.xml para o seu enterprise bean, mude as suas classes Java simples JAX-RS para se tornarem enterprise beans ativados para JAX-RS. Por exemplo, é possível incluir o seguinte fragmento de código no descritor de implementação WEB-INF/ejb-jar.xml:
      <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
      <!--
          Esse arquivo deve existir no diretório WEB-INF/ do seu arquivo WAR.
          Consulte a especificação 20.4 do EJB 3.1 para obter mais detalhes.
      -->
          <enterprise-beans>
              <session>
                  <ejb-name>Organization</ejb-name>
                  <ejb-class>com.example.jaxrs.Organization</ejb-class>
                  <session-type>Stateless</session-type>
              </session>
          </enterprise-beans>
      </ejb-jar>

      Se desejar tornar um enterprise bean um singleton usando o descritor de implementação, use <session-type>Singleton</ session-type> em vez de <session-type>Stateless</session-type>.

    • Inclua uma anotação @javax.ejb.Stateless na classe Java do seu enterprise bean. O exemplo a seguir demonstra um enterprise bean anotado do JAX-RS simples:
      package com.example.jaxrs;
      @javax.ejb.Stateless
      @javax.ws.rs.Path("/organization/")
      public class Organization {
      
          @javax.ws.rs.GET
          @javax.ws.rs.Produces("text/plain")
          public String getInformation() {
              // retornar informações por meio de uma Sequência
          }
      }

      Se desejar tornar o enterprise bean um singleton usando anotações, use a anotação @javax.ejb.Singleton do EJB 3.1 em vez da anotação @javax.ejb.Stateless.

  3. Inclua anotações JAX-RS nos métodos que desejar expor como uma interface RESTful para o enterprise bean. O exemplo a seguir demonstra a inclusão de anotações JAX-RS no enterprise bean @javax.ejb.Stateless.
    pacote com.example.jaxrs;
    
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // retornar informações por meio de uma Sequência
        }
    }
  4. (opcional) Inclua campos e propriedades do recurso Java EE anotado do @javax.annotation.Resource nas suas classes JAX-RS EJB para acessar facilmente os recursos no seu aplicativo. As injeções Java EE não funcionam em classes Java simples com anotações JAX-RS. Injetar campos e propriedades do recurso Java EE anotado do @javax.annotation.Resource nas suas classes JAX-RS EJB apenas funciona se as suas classes anotadas JAX-RS forem um enterprise bean ou um bean gerenciado Java Context and Dependency Injection (JCDI) (JSR-299); por exemplo:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.annotation.Resource(name="jdcb/TestDataSource")
        private javax.sql.DataSource datasource;
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // ler da origem de dados
            // retornar informações por meio de uma Sequência
        }
    }
    Nesse exemplo, se uma origem de dados está configurada adequadamente com o nome do JNDI correto, um objeto DataSource é injetado na classe de recurso.
  5. (opcional) Use injeção de JAX-RS @javax.ws.rs.core.Context para obter acesse às informações sobre o pedido. É possível incluir um campo UriInfo @javax.ws.rs.core.Context na sua classe EJB do JAX-RS para acessar informações sobre a URI do pedido; por exemplo:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
        @javax.ws.rs.core.Context
        private UriInfo uriInfo;
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation() {
            // retornar informações por meio de uma Sequência
        }
    }
    Para ler parâmetros do pedido como @javax.ws.rs.HeaderParam, @javax.ws.rs.QueryParam, e @javax.ws.rs.PathParam, inclua um parâmetro no seu método de recurso; por exemplo:
    @javax.ejb.Stateless
    @javax.ws.rs.Path("/organization/")
    public class Organization {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces("text/plain")
        public String getInformation(@javax.ws.rs.QueryParam("page") String page) {
            /* O QueryParam na lista de parâmetros do método será configurado corretamente. */
            // retornar informações usando uma Sequência
        }
    
        /* O seguinte campo não será configurado. */
        @javax.ws.rs.QueryParam("q")
        private String willNotWork;
    
        @javax.ws.rs.QueryParam("q")
        public void setMyQueryParam(String q) {
            /* Essa propriedade não será configurada. */
        }
    }
    Configurações suportadas Configurações suportadas: A injeção de parâmetro de propriedade e campo do JAX-RS, como @javax.ws.rs.QueryParam, não é suportada.sptcfg
  6. Inclua a classe EJB no diretório WEB-INF/classes do seu arquivo WAR ou em um JAR que está localizado no seu diretório WEB-INF/lib. Quando um cliente faz uma solicitação a um enterprise bean anotado do JAX-RS, o ambiente de tempo de execução do JAX-RS procura e usa uma instância EJB da classe para chamar o método do recurso.

Resultados

Você ativou um enterprise bean existente com visualização sem interface para que os recursos JAX-RS sejam expostos para consumo.


Í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_ejb_nointerface
Nome do arquivo: twbs_jaxrs_ejb_nointerface.html