我正在使用Java EE 6& Jboss AS7.1并尝试使用拦截器绑定(Example from jboss site)。
我有一个InterceptorBinding注释:
@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) {
/* ... */
}
感谢您的帮助。
答案 0 :(得分:13)
根据文档,还有另一种方法,而不是使用beans.xml:
您不需要在beans.xml文件中指定拦截器 你使用@Priority注释。
@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }
它有效。
答案 1 :(得分:12)
您是否按参考示例中所述启用了拦截器?
默认情况下,bean存档没有启用的绑定器 拦截器绑定。必须明确启用拦截器 在beans.xml的元素下列出它的类 bean档案的文件。
答案 2 :(得分:3)
您可以使用任何优先级值= Priority.Application默认为2000。
例如=
{{1}}
优先类型:
您可以管理拦截器的主要负载。