未使用拦截器绑定调用的拦截器方法

2022-09-03 17:31:00

我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss站点的示例)。

我有一个拦截器绑定注释:

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

拦截器:

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

还有一颗豆子:

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

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

但是拦截器不叫...我从示例中错过了什么?

当我写这个时,拦截器被调用:

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

感谢您的帮助。


答案 1

根据文档,除了使用bean之外,还有另一种方法.xml:

使用 bean.xml 注释时,不需要在 bean.xml 文件中指定拦截 @Priority器。

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

它的工作原理。


答案 2

是否按照引用示例中所述启用了侦听器?

缺省情况下,Bean 归档没有通过拦截器绑定绑定的已启用拦截器。必须通过在 bean 归档文件的 bean.xml 文件的元素下列出拦截器的类来显式启用拦截器。


推荐