É possível usar a Java™ Contexts and Dependency Injection (JCDI) para gravar interceptores e decoradores para Java API para tipos de recurso RESTful Web
Services (JAX-RS). Por exemplo, é possível usar os recursos do interceptor e do decorador a partir do JCDI para registrar chamadas para uma classe particular ou para concluir uma verificação de segurança antes de chamar um método quando usar aplicativos da Web ativados para JCDI com JAX-RS.
Sobre Esta Tarefa
Existem dois métodos para incluir questões secundárias em seu aplicativo. Ligações de interceptor precisam de uma anotação customizada. A anotação é usada para marcar quais métodos devem ser interceptados. Decoradores implementam o tipo de base. Depois, usando uma instância injetada @javax.decorator.Decorator, é possível implementar sua lógica especial ao redor das chamadas para o delegado injetado.
Procedimento
- Crie uma anotação para indicar que um método está interceptado. Essa anotação SecurityChecked indica um método no qual algumas informações de segurança são verificadas. O exemplo a seguir ilustra uma anotação customizada com um 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 {
}
- Crie sua classe de recurso JAX-RS, e anote quaisquer métodos que desejar interceptar com a anotação @com.example.jaxrs.SecurityChecked. O exemplo a seguir ilustra uma classe de recurso com um método interceptado:
pacote 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!";
}
}
- Grave uma classe de interceptor que esteja anotada com a anotação @javax.interceptor.Interceptor e com o marcador de interceptor @com.example.jaxrs.SecurityChecked. Depois, inclua um método anotado com a anotação @javax.interceptor.AroundInvoke com o parâmetro javax.interceptor.InvocationContext. É possível usar os métodos InvocationContext para inspecionar a chamada de método, assim como determinar se a chamada deve prosseguir. O exemplo a seguir ilustra um 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 {
/* verifique os parâmetros ou faça uma verificação de segurança genérica antes de chamar o
método original */
Object[] params = context.getParameters();
/* se a validação de segurança falhar, é possível lançar uma exceção */
/* chame o método proceed() para chamar o método original */
Object ret = context.proceed();
/* execute qualquer pós-trabalho da chamada de método */
return ret;
}
}
- 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. Algumas informações para essa instância são solicitadas. O exemplo a seguir ilustra um arquivo WEB-INF/beans.xml com um interceptor listado:
<?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>
Nas etapas anteriores, você configurou um aplicativo da Web para usar o JCDI, incluiu uma anotação customizada para marcar métodos para interceptação e escreveu um interceptor. Quando um método marcado é chamado, o interceptor é usado para determinar se o método marcado deve ser chamado e pode executar lógica adicional. Liste primeiro os seus interceptores no seu descritor de implementação beans.xml.Nas etapas restantes, você cria e ativa um decorador em um aplicativo da Web ativado para JCDI. Ligações de interceptor necessitam de uma anotação para marcar métodos para intercepção. Os decoradores implementam o tipo de base comum e podem quebrar os chamadas.
- Localize ou crie o tipo de base que o decorador deve implementar. Por exemplo, o tipo de base pode ser uma interface nomeada Item.
O exemplo a seguir ilustra uma interface comum usado por um decorador:
package com.example.jaxrs;
import javax.ws.rs.GET;
public interface Item {
@GET
public String getInformation();
}
- Crie uma classe de recurso JAX-RS padrão que implementa o tipo de base. O exemplo a seguir ilustra uma classe de recurso JAX-RS que será decorada:
pacote com.example.jaxrs;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Path;
@Path("decoratedresource")
@RequestScoped
public class MyItem implements Item {
public String getInformation() {
/* retornar algumas informações */
}
}
- Crie uma classe de decorador. A classe do decorador deve implementar o tipo de base para o qual quebra todas as chamadas. O decorador deve ser anotado com a anotação @javax.decorator.Decorator.
O decorador deve ter um campo especial, chamado de ponto de injeção delegado, com o tipo de base. O campo pode ter um nome variável, e deve ter uma anotação @javax.inject.Inject e uma @javax.decorator.Delegate.
Esse campo será o objeto original que está sendo decorado. Depois, é possível usar esse objeto decorado em suas chamadas de implementação.
O exemplo a seguir ilustra uma classe 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() {
/* executa alguma criação de registro */
String info = decoratedItem.getInformation();
/* executa mais alguma criação de registro */
return info;
}
}
- Inclua um descritor de implementação beans.xml no seu arquivo 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. Algumas informações quanto às classes do decorador ativa para essa instância são solicitadas. O exemplo a seguir ilustra um arquivo WEB-INF/beans.xml com um decorator listado:
<?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
Você configurou um aplicativo da Web para usar o JCDI, criou um interceptor de método para um recurso, criou um decorador e o ativou para decorar as suas chamadas de método para um segundo recurso.