2012-08-22 16 views
10

Sto utilizzando Java EE 6 & Jboss AS7.1 e provo a utilizzare il binding di intercettatore (Example from jboss site).Metodo di intercettazione non chiamato con intercettazione

devo un'annotazione InterceptorBinding:

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

L'intercettore:

@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(); 
    } 
} 

E un fagiolo:

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

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

Ma l'intercettore non si chiama ... Di cosa ho manca l'esempio?

L'intercettore viene chiamato quando scrivo questo:

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

Grazie per il vostro aiuto.

risposta

12

Hai abilitato il tuo intercettore come descritto nell'esempio di riferimento?

Per impostazione predefinita, un archivio bean non ha intercettori abilitati rilegati tramite i collegamenti di intercettatore . Un intercettore deve essere esplicitamente abilitato da elencando la sua classe sotto l'elemento del file beans.xml dell'archivio bean.

+1

Grazie mille, ho letto l'esempio troppo velocemente, ho pensato che usando le annotazioni non era obbligatorio usare il bean.xml ma in realtà è ... –

+2

Questo sembra essere il caso anche di JavaEE7. –

11

Secondo la documentazione c'è un altro modo piuttosto che usare beans.xml:

Non è necessario specificare l'intercettore nel file beans.xml quando si utilizza l'annotazione @Priority.

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

E funziona.

+1

Grazie mille !! hai risolto il mio problema :) –

+0

Grazie mille!Hai risolto anche il mio :) – KeyMaker00

3

È possibile utilizzare qualsiasi valore di priorità = Priority.Application è 2000 per impostazione predefinita.

Per esempio =

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

tipo Asse:

  • PLATFORM_BEFORE [0-999] - intercettori partono prima. Sono iniziati dalla piattaforma.
  • LIBRARY_BEFORE [1000-1999] - dalle biblioteche.
  • APPLICAZIONE [2000-2999] - dall'applicazione
  • LIBRARY_AFTER, PLATFORM_AFTER [3000-4000]

È gestire il caricamento primario per intercettori.

Problemi correlati