2012-10-11 41 views
6

Estoy construyendo una aplicación Java EE usando JBoss 7.1.Interceptores Java EE y @ViewScoped bean

Para obtener una auditoría completa de las acciones del usuario, estoy planeando usar Interceptores para registrar cada invocación de los métodos de mis beans.

para hacerlo tengo el siguiente biding:

@Inherited 
@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
public @interface Logged { 
} 

Luego defino mi clase interceptor:

@Logged 
@Interceptor 
public class UserActionInterceptor implements Serializable { 

private static final long serialVersionUID = 1L; 
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class); 

public UserActionInterceptor() { 
} 

@AroundInvoke 
public Object logMethodEntry(InvocationContext invocationContext) throws Exception { 
    log.debug(invocationContext.getMethod().getName() + " invoked."); 
    return invocationContext.proceed(); 
    } 
} 

bien hasta ahora esto está funcionando. Si enlace una clase usando este Interceptor, obtengo un poco de registro. Sin embargo, se vuelve más complicado cuando quiero orientar mis clases de frijoles.

Si tengo un bean del tipo @RequestScoped y lo ato a mi interceptor, funciona. Sin embargo, si tengo un bean de tipo @ViewScoped, entonces no es.

busqué la definición de @ViewScoped y me encontré:

@Retention(value=RUNTIME) 
@Target(value=TYPE) 
@Inherited 
public @interface ViewScoped 

tengo la sensación de que el problema radica en el hecho de que esta anotación no tiene el método del tipo de destino y que impide que mi interceptor intercepte llamadas a los métodos de clase.

¿Alguien ha tenido el mismo problema anteriormente? ¿Alguien sabe si es posible ampliar el alcance del bean para que sus métodos puedan ser interceptados sin cambiar la naturaleza de @ViewScoped?

Respuesta

3

Esto sucede porque el interceptor no puede acceder al @ManagedBean. @ViewScope no es parte del CDI y viene con beans JSF.

Para que funcione, la forma más segura es usar @ViewScoped con CDI utilizando una de las extensiones que lo proporciona. Sus opciones incluyen MyFaces CODI y Seam 3 (por ejemplo).

lo tengo trabajo (la misma forma en que lo describe) mediante la instalación de MyFaces CODI y el uso de las siguientes anotaciones con estas importaciones:

import javax.faces.bean.ViewScoped; 
import javax.inject.Named; 

@Named 
@ViewScoped 
@Interceptors({ MyInterceptor.class}) 
Cuestiones relacionadas