Implementar un recurso JAX-RS con decoradores e interceptores de método

Puede utilizar JCDI (Java™ Contexts and Dependency Injection) para escribir interceptores y decoradores para tipos de recursos JAX-RS (API Java para servicios web RESTful). Por ejemplo, puede utilizar las funciones de interceptor y decorador desde JCDI para registrar llamadas a una clase determinada o para completar una comprobación de seguridad antes de invocar un método al utilizar aplicaciones web habilitadas para JCDI con JAX-RS.

Acerca de esta tarea

Existen dos métodos para añadir preocupaciones generales a la aplicación. Los enlaces de interceptor requieren una anotación personalizada. La anotación se utiliza para marcar qué métodos se debe interceptar. Los decoradores implementan el tipo base. A continuación, mediante una instancia @javax.decorator.Decorator inyectada, puede implementar la lógica especial en las llamadas al delegado inyectado.

Procedimiento

  1. Cree una anotación para indicar que se intercepta un método. Esta anotación SecurityChecked indica un método en el que se verifica cierta información de seguridad. El ejemplo siguiente muestra una anotación personalizada con un método interceptado:
    package com.example.jaxrs;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.interceptor.InterceptorBinding;
    
    @Inherited
    @InterceptorBinding
    @Target( {ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SecurityChecked {
    
    }
  2. Cree la clase de recurso JAX-RS y anote los métodos que desea interceptar con la anotación @com.example.jaxrs.SecurityChecked. El ejemplo siguiente muestra una clase de recurso JAX-RS con un método interceptado:
    package com.example.jaxrs;
    
    import javax.enterprise.context.RequestScoped;
    import javax.ws.rs.Path;
    import javax.ws.rs.GET;
    
    @Path("exampleInterceptor")
    @RequestScoped
    public class MyResourceBean {
    
        @GET
        @com.example.jaxrs.SecurityChecked
        public String echo(String hello) {
            return "Hello world!";
        }
    }
  3. Escriba una clase de interceptor anotada con la anotación @javax.interceptor.Interceptor y con el marcador de interceptor @com.example.jaxrs.SecurityChecked. A continuación, añada un método anotado con la anotación @javax.interceptor.AroundInvoke con el parámetro javax.interceptor.InvocationContext. Puede utilizar los métodos InvocationContext para inspeccionar la llamada de método, así como para determinar si la llamada debe continuar. En el ejemplo siguiente se muestra un interceptor:
    package com.example.jaxrs;
    
    import javax.interceptor.AroundInvoke;
    import javax.interceptor.Interceptor;
    import javax.interceptor.InvocationContext;
    
    @Interceptor
    @com.example.jaxrs.SecurityChecked
    public class SecurityCheckInterceptor {
    
        @AroundInvoke
        public Object checkSecurity(InvocationContext context) throws Exception {
            /* comprobar los parámetros o realizar una comprobación de seguridad genérica antes de invocar el
               método original */
            Object[] params = context.getParameters();
    
            /* si la validación de seguridad falla, puede generar una excepción */
    
            /* invocar el método proceed() para que llame al método original */
            Object ret = context.proceed();
    
            /* realizar cualquier trabajo posterior a llamada de método */
            return ret;
        }
    }
  4. 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. Es necesario añadir información para esta instancia. En el ejemplo siguiente se muestra un archivo WEB-INF/beans.xml con un interceptor en la lista:
    <?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">
        <interceptors>
            <class>com.example.jaxrs.SecurityCheckInterceptor</class>
        </interceptors>
    </beans>
    En los pasos anteriores, ha configurado una aplicación web para utilizar JCDI, ha añadido una anotación personalizada para marcar los métodos que se interceptarán y ha escrito un interceptor. Cuando se llama a un método marcado, se utiliza el interceptor para determinar si se debe llamar al método marcado y puede realizar la lógica adicional. Debe listar los interceptores en el descriptor de despliegue beans.xml.

    En los pasos que quedan, crea y habilita un decorador en una aplicación web habilitada para JCDI. Los enlaces de interceptor requieren una anotación para marcar los métodos de interceptación. Los decoradores implementan el tipo base común y puede incluir las llamadas.

  5. Busque o cree el tipo base que el decorador debe implementar. Por ejemplo, el tipo base puede ser una interfaz denominada Item. En el ejemplo siguiente se muestra una interfaz común que utiliza un decorador:
    package com.example.jaxrs;
    
    import javax.ws.rs.GET;
    
    public interface Item {
    
        @GET
        public String getInformation();
    }
  6. Cree una clase de recurso JAX-RS estándar que implemente el tipo base. En el ejemplo siguiente se muestra una clase de recurso JAX-RS que se decorará:
    package com.example.jaxrs;
    
    import javax.enterprise.context.RequestScoped;
    import javax.ws.rs.Path;
    
    @Path("decoratedresource")
    @RequestScoped
    public class MyItem implements Item {
    
        public String getInformation() {
            /* devolver información */
        }
    
    }
  7. Cree una clase de decorador. La clase de decorador debe implementar el tipo base en el que incluye todas las llamadas. El decorador se debe anotar con la anotación @javax.decorator.Decorator.

    El decorador debe tener un campo especial, denominado punto de inyección de delegado, con el tipo base. El campo puede tener cualquier nombre de variable y debe tener un @javax.inject.Inject y una anotación @javax.decorator.Delegate. Este campo será el objeto original que se está decorado. A continuación, puede utilizar este objeto decorado en las llamadas de implementación.

    En el ejemplo siguiente se muestra una clase de decorador básica:

    package com.example.jaxrs;
    
    import javax.decorator.Decorator;
    import javax.decorator.Delegate;
    import javax.inject.Inject;
    
    @Decorator
    public class MyItemDecorator implements Item {
    
        @Inject
        @Delegate
        private Item decoratedItem;
    
        public String getInformation() {
            /* realizar registro cronológico */
            String info = decoratedItem.getInformation();
            /* realizar registro cronológico adicional */
            return info;
        }
    }
  8. Añada un descriptor de despliegue beans.xml al archivo WAR (Web Application Archive) en el directorio WEB-INF. La existencia del archivo WEB-INF/beans.xml indica que el archivo es un archivo habilitado para JCDI. Debe añadir información sobre las clases de decorador activas para esta instancia. En el ejemplo siguiente se muestra un archivo WEB-INF/beans.xml con un decorador en la lista:
    <?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">
        <interceptors>
            <class>com.example.jaxrs.SecurityCheckInterceptor</class>
        </interceptors>
        <decorators>
            <class>com.example.jaxrs.MyItemDecorator</class>
        </decorators>
    </beans>

Resultados

Ha configurado una aplicación web para utilizar JCDI, ha creado un interceptor de método para un recurso, ha creado un decorador, y lo ha habilitado para decorar las llamadas de método para un segundo recurso.


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_decoratorsandmethod
File name: twbs_jaxrs_jcdi_decoratorsandmethod.html