2012-08-22 10 views
10

Ich verwende Java EE 6 & Jboss AS7.1 und versuchen, Interceptor-Bindung (Example from jboss site) zu verwenden.Interceptor-Methode nicht mit Interceptor-Bindung

Ich habe eine InterceptorBinding Anmerkung:

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

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

Und eine Bohne:

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

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

Aber die Abfangjäger nicht aufgerufen ... Was muss ich tun Miss von dem Beispiel?

Der Interceptor aufgerufen wird, wenn ich dies schreibe:

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

Vielen Dank für Ihre Hilfe.

Antwort

12

Haben Sie Ihren Interceptor wie im Beispiel beschrieben aktiviert?

Standardmäßig hat ein Bean-Archiv keine Interceptors aktiviert, die über Interceptor-Bindungen gebunden sind. Ein Interceptor muss explizit durch aktiviert werden, indem seine Klasse unter dem Element der Datei beans.xml des Bean-Archivs aufgelistet wird.

+1

Vielen Dank, ich las das Beispiel zu schnell, ich dachte, dass mit Annotationen war es nicht obligatorisch, die beans.xml zu verwenden, aber in Wirklichkeit ist es ... –

+2

Dies scheint auch mit JavaEE7 der Fall zu sein. –

11

Gemäß der Dokumentation gibt es eine andere Art und Weise statt mit beans.xml:

Sie brauchen nicht die Abfangjäger in der beans.xml Datei angeben, wenn Sie die @Priority Anmerkung verwenden.

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

Und es funktioniert.

+1

Vielen Dank !! Du hast mein Problem gelöst :) –

+0

Vielen Dank!Du hast mein auch gelöst :) – KeyMaker00

3

Sie können einen beliebigen Prioritätswert verwenden = Priorität.Anwendung ist 2000 standardmäßig.

Zum Beispiel =

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

Zwangssteuerungsart:

  • PLATFORM_BEFORE [0-999] - Abfangjäger beim ersten Start. Sie werden von der Plattform gestartet.
  • LIBRARY_BEFORE [1000-1999] - von den Bibliotheken.
  • ANWENDUNG [2000-2999] - durch die Anwendung
  • LIBRARY_AFTER, PLATFORM_AFTER [3000-4000]

Sie verwalten für Abfangjäger primäre Belastung.