Implementación de vistas RESTful de EJB sin interfaz

Si tiene aplicaciones EJB (Enterprise JavaBeans) expuestas utilizando una vista sin interfaz, puede exponer una interfaz RESTful al enterprise bean utilizando JAX-RS (API Java™ para servicios web RESTful). Mediante la implementación de enterprise beans JAX-RS anotados, puede mantener la funcionalidad EJB incluyendo el soporte de transacciones, la inyección de componentes y recursos Java EE y otras funciones de bean de sesión EJB.

Antes de empezar

Antes de EJB 3.1, los enterprise beans que requerían una vista de cliente local EJB también requerían una interfaz Java diferente, normalmente ubicada en un archivo aparte, que declaraba los métodos de vista local. El enterprise bean especificaba que implementaba la interfaz de vista local EJB mediante descriptores de despliegue o anotaciones EJB.

Mediante la especificación EJB 3.1, tiene la opción de exponer una vista local de un enterprise bean sin una interfaz local EJB explícita. En su lugar, el enterprise bean tiene una vista de cliente sin interfaz que se basa en métodos públicos de la clase de bean. Los enterprise beans de vista sin interfaz pueden ser más sencillos de desarrollar que un enterprise bean de vista local por las razones siguientes:
  • Los enterprise beans de vista sin interfaz no requieren una declaración de interfaz Java aparte.
  • Los enterprise beans de vista sin interfaz no requieren la especificación de metadatos adicionales en el descriptor de despliegue o al utilizar anotaciones EJB.
Consulte la especificación EJB 3.1 para obtener más detalles sobre las vistas sin interfaz de un enterprise bean.

JAX-RS da soporte al uso de enterprise beans que declaren una interfaz empresarial local y enterprise beans de vista sin interfaz.

Best practice Best practice: Aunque puede declarar enterprise beans de diferentes formas, se trata de un procedimiento recomendado para implementar directamente la interfaz local de empresa EJB y para declarar siempre la anotación @javax.ejb.Local. Utilizando este método, el bean EJB es necesario para implementar la interfaz empresarial local, que elimina los errores al especificar nombres de método y los cambios en los tipos de argumento. Utilizando siempre la anotación @javax.ejb.Local, si hay alguna vez varias interfaces empresariales, puede simplemente añadir la interfaz empresarial al valor de la anotación. También puede utilizar este enfoque para modificar el enterprise bean utilizando un descriptor de despliegue. bprac

Esta tarea describe la implementación de vistas RESTful de enterprise beans de vista sin interfaz.

Acerca de esta tarea

Puede crear un enterprise bean simple con anotaciones JAX-RS. Aunque esta tarea describe específicamente cómo implementar vistas RESTful de enterprise beans de vista sin interfaz, es importante que tenga en cuenta el ámbito completo de la arquitectura de la aplicación y cómo desea exponer los recursos cuando decida el modelo de recursos y determine qué vistas RESTful son adecuadas para la aplicación de enterprise beans. Estas consideraciones quedan fuera del ámbito de esta tarea.

JAX-RS da soporte a beans de sesión monoinstancia (singleton) y sin estado. Puede añadir anotaciones JAX-RS a la interfaz local de un bean de sesión. Además, con EJB 3.1, puede añadir anotaciones JAX-RS directamente a una clase EJB si el enterprise bean expone una vista sin interfaz.

Con las reglas de empaquetado de EJB 3.1, puede añadir enterprise beans JAX-RS en el archivo WAR (Web Application Archive) directamente en el directorio WEB-INF/classes o utilizando un archivo JAR (Java Archive) en el directorio WEB-INF/lib. Puede declarar un enterprise bean utilizando anotaciones o utilizando un descriptor de despliegue EJB o utilizando ambos.

No se da soporte a enterprise beans anotados JAX-RS en un archivo autónomo o en un archivo ejb-jar aparte incluido en un EAR.

Procedimiento

  1. Cree un enterprise bean. En el ejemplo siguiente, hay una clase EJB simple denominada Organization. Esta clase se beneficia de la característica de clase de vista sin interfaz introducida en la especificación EJB 3.1.
    public class Organization {
        public String getInformation() {
            // devolver información mediante una serie
        }
    }
  2. Para exponer un enterprise bean como un recurso JAX-RS, realice uno de los pasos siguientes:
    • En el archivo de descriptor de despliegue WEB-INF/ ejb-jar.xml para el enterprise bean, cambie las clases Java JAX-RS sin formato para que pasen a ser enterprise beans habilitados para JAX-RS. Por ejemplo, puede añadir el siguiente fragmento de código al descriptor de despliegue 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">
      <!--
          Este archivo debe existir en el directorio WEB-INF/ del archivo WAR.
          Consulte la especificación EJB 3.1 20.4 para obtener más detalles.
      -->
          <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>

      Si desea hacer del enterprise bean un singleton utilizando el descriptor de despliegue, utilice <session-type>Singleton</ session-type> en lugar de <session-type>Stateless</session-type>.

    • Añada una anotación @javax.ejb.Stateless a la clase Java del enterprise bean. En el ejemplo siguiente se muestra un enterprise bean anotado JAX-RS simple:
      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() {
              // devolver información mediante una serie
          }
      }

      Si desea hacer del enterprise bean un singleton utilizando anotaciones, utilice la anotación @javax.ejb.Singleton de EJB 3.1 en lugar de la anotación @javax.ejb.Stateless.

  3. Añada anotaciones JAX-RS a los métodos que desea exponer como interfaz RESTful apl enterprise bean. En el ejemplo siguiente se muestra cómo añadir anotaciones JAX-RS al enterprise bean @javax.ejb.Stateless.
    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() {
            // devolver información mediante una serie
        }
    }
  4. (opcional) Añada propiedades y campos de recursos Java EE anotados @javax.annotation.Resource a las clases EJB JAX-RS para acceder fácilmente a recursos de la aplicación. Las inyecciones Java EE no funcionan en clases Java sin formato con anotaciones JAX-RS. La inyección de propiedades y campos de recursos Java EE anotados @javax.annotation.Resource a las clases EJB JAX-RS sólo funciona si las clases anotadas JAX-RS son enterprise bean o un bean gestionado JCDI (Java Context and Dependency Injection) (JSR-299); por ejemplo:
    @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() {
            // leer del origen de datos
            // devolver información mediante una serie
        }
    }
    En este ejemplo, si un origen de datos está configurado correctamente con el nombre JNDI correcto, se inyecta un objeto DataSource en la clase de recurso.
  5. (opcional) Utilice la inyección JAX-RS @javax.ws.rs.core.Context para obtener acceso a información sobre la solicitud. Puede añadir un campo @javax.ws.rs.core.Context UriInfo a la clase EJB JAX-RS para acceder a información sobre el URI de solicitud; por ejemplo:
    @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() {
            // devolver información mediante una serie
        }
    }
    Para leer parámetros de la solicitud como por ejemplo @javax.ws.rs.HeaderParam, @javax.ws.rs.QueryParam y @javax.ws.rs.PathParam, añada un parámetro al método de recurso, por ejemplo:
    @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) {
            /* El QueryParam en la lista de parámetros de método se establecerá correctamente. */
            // Devolver información utilizando una serie
        }
    
        /*  El campo siguiente no se establecerá. */
        @javax.ws.rs.QueryParam("q")
        private String willNotWork;
    
        @javax.ws.rs.QueryParam("q")
        public void setMyQueryParam(String q) {
            /* Esta propiedad no se establecerá. */
        }
    }
    Supported configurations Supported configurations: No se da soporte a la inyección de parámetros de propiedad y campos de JAX-RS, como por ejemplo @javax.ws.rs.QueryParam.sptcfg
  6. Añada la clase EJB al directorio WEB-INF/classes del archivo WAR o a un archivo JAR que se encuentra en el directorio WEB-INF/lib. Cuando un cliente realiza una solicitud a un enterprise bean anotado JAX-RS, el entorno de ejecución de JAX-RS busca y utiliza una instancia EJB de la clase para invocar el método de recursos.

Resultados

Ha habilitado un enterprise bean existente con vista sin interfaz de modo que los recursos JAX-RS se exponen para el consumo.


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_ejb_nointerface
File name: twbs_jaxrs_ejb_nointerface.html