没有使用拦截器绑定调用拦截器方法

Phi*_*day 12 java ejb interceptor java-ee-6

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

我有一个InterceptorBinding注释:

@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeoRestrictedEquipment {
}
Run Code Online (Sandbox Code Playgroud)

拦截器:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个豆子:

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

    @Override
    @GeoRestrictedEquipment
    public PumpInfos getPumpInfos(Integer pumpId) {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

但拦截器没有被调用......我从这个例子中错过了什么?

我写这个时会调用拦截器:

@Override
@Interceptors({GeoRestrictedEquipmentInterceptor.class})
public PumpInfos getPumpInfos(Integer pumpId) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

小智 13

根据文档,还有另一种方法,而不是使用beans.xml:

使用@Priority批注时,无需在beans.xml文件中指定拦截器.

@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }
Run Code Online (Sandbox Code Playgroud)

它有效.


zel*_*lus 12

您是否按照引用示例中的描述启用了拦截器?

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

  • 这似乎也是JavaEE7的情况. (2认同)