SCBCD - Interceptores (aún más ...)

(Imagen: Claude Monet - Amanecer)

Interceptores a nivel de método: Este es el tipo de cosas que no están en el libro pero que te toman en el examen :S. Un interceptor de métodos de negocio se aplica a un método específico del bean, en lo lugar de interceptar todos los métodos del bean con los interceptores que vimos antes. Para asignarle un interceptor a un método, usamos la anotación @Interceptors , que ya es una vieja conocida; o también con el descriptor de despliegue mediante el elemento interceptor-binding.

Como siempre, me emociono con las palabras y no recurro al código. Pero prometo enmendarme; por lo que ahora les presento un bean donde dos métodos son inteceptados por la misma clase interceptora:

@Stateless
public class MyBean ... {
public void notIntercepted (){}

@Interceptors(org.acme.MyInterceptor.class)
public void someMethod(){
...
}

@Interceptors(org.acme.MyInterceptor.class)
public void anotherMethod(){
...
}
}

En el snipet, tanto someMethod como another Method son interceptados por la clase MyInterceptor. Como recordatorio, siempre se crea una instancia de interceptor por instancia de bean , por lo que a pesar que el mismo interceptor ha sido aplicado a varios métodos en memoria sólamente habrá una solitaria instancia de ese interceptor (si se definen más interceptores para este bean, también de estos se mantiene una instancia).

En el post anterior vimos a los interceptores por defecto, que se aplican a todos los componentes de un ejb-jar. Ahora, esto no siempre es conveniente; por lo que tener la capacidad de definir excepciones a esta regla, dada por la anotación @ExcludeDefaultInterceptors y el elemento exclude-default-interceptors, es de bastante utilidad. A nivel de método, también se puede decidir obviar los interceptores de clase por medio de la anotación @ExcludeClassInterceptors (y el elemento de DD exclude-class-interceptors); pero mejor veámoslo con un poco de código, que nos es más familiar:

De no definirse interceptores por defecto, sólamente se invoca el interceptor en MyInterceptor al llamar a someMethod. El interceptor de clase AnotherInterceptor no es invocado debido a la presencia de la notación @ExcludeClassInterceptors:

@Stateless
@Interceptors (org.acme.AnotherInterceptor.class)
public class MyBean ... {
...
@Interceptors(org.acmeMyInterceptor.class)
@ExcludeClassInterceptors
public void someMethod(){
...
}
}

Ahora, si tuvieramos también interceptores por defecto, y no quisieramos que intercepten a someMethod, el bean quedaría así:

@Stateless
@Interceptors (org.acme.AnotherInterceptor.class)
public class MyBean ... {
...
@ExcludeDefaultInterceptors
@ExcludeClassInterceptors
@Interceptors (org.acme.MyInterceptor.class)
public void someMethod(){
...
}
}

Y hasta aquí la dejamos en este post. Lamentablemente, el siguiente también es de interceptores (pero prometo que es el último!!)

Publicar un comentario