2012-08-22 11 views
10

Estoy utilizando Java EE 6 & Jboss AS7.1 y trato de usar enlace de interceptor (Example from jboss site).Método de interceptor no llamado con enlace de interceptor

que tienen una anotación InterceptorBinding:

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

El interceptor:

@GeoRestrictedEquipment 
@Interceptor 
public class GeoRestrictedEquipmentInterceptor { 

    @EJB EquipmentDao equipmenttDao;  
    @EJB SecurityService securityService;  

    @AroundInvoke 
    public Object checker(InvocationContext ctx) throws Exception { 
     Integer id = (Integer) ctx.getParameters()[0]; 
     Equipment equipment = equipmenttDao.findById(id); 
     GeoChecker.check(equipment.getSite(), securityService.getUser()); 

     return ctx.proceed(); 
    } 
} 

Y un grano:

@Stateless 
@LocalBean 
@SecurityDomain(Realm.NAME) 
@RolesAllowed({ Roles.REGISTERED }) 
public class PumpService implements PumpServiceLocal { 

    @Override 
    @GeoRestrictedEquipment 
    public PumpInfos getPumpInfos(Integer pumpId) { 
     /* ... */ 
    } 
} 

Pero el interceptor no se llama ... ¿Qué tengo ¿Extrañar el ejemplo?

El interceptor se llama cuando escribo esto:

@Override 
@Interceptors({GeoRestrictedEquipmentInterceptor.class}) 
public PumpInfos getPumpInfos(Integer pumpId) { 
    /* ... */ 
} 

Gracias por su ayuda.

Respuesta

12

¿Ha habilitado su interceptor como se describe en el ejemplo al que se hace referencia?

De forma predeterminada, un archivo de bean no tiene interceptores habilitados vinculados mediante enlaces de interceptor. Un interceptor debe estar explícitamente habilitado por listando su clase bajo el elemento del archivo beans.xml del archivo bean.

+1

Muchas gracias, leí el ejemplo demasiado rápido, pensé que al usar las anotaciones no era obligatorio usar beans.xml, pero de hecho es ... –

+2

Este parece ser el caso con JavaEE7 también. –

11

De acuerdo con la documentación que hay otra manera en lugar de utilizar beans.xml:

No es necesario especificar el interceptor en el archivo beans.xml cuando usamos la anotación @Priority.

@Logged 
@Interceptor 
@Priority(Interceptor.Priority.APPLICATION) 
public class LoggedInterceptor implements Serializable { ... } 

Y funciona.

+1

¡Muchas gracias! usted resolvió mi problema :) –

+0

¡Muchas gracias!Usted también ha resuelto mi :) – KeyMaker00

3

Puede usar cualquier valor de prioridad = Prioridad. La aplicación es 2000 por defecto.

Por ejemplo =

@Interceptor 
@Loggable 
@Priority(100) 
public class FileLogger {} 

tipo Prioridad:

  • PLATFORM_BEFORE [0-999] - interceptores comienzan a partir de la primera. Ellos son iniciados por la plataforma.
  • LIBRARY_BEFORE [1000-1999] - por las bibliotecas.
  • APLICACIÓN [2000-2999] - por la aplicación
  • LIBRARY_AFTER, PLATFORM_AFTER [3000-4000]

a manejar la carga principal de los interceptores.

Cuestiones relacionadas