我构建了一个由EJB和WAR模块组成的简单ear应用程序。我使用CDI拦截器来拦截对JSF动作的调用来做一些操作。除了使用interceptorbiding注释注释action方法时出现的奇怪行为,一切都正常。更确切地说,这是代码:
这是拦截器等级类
@Inherited
@Documented
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface SecurityCheck {
}
这是拦截器类:
@Interceptor
@SecurityCheck
@Priority(Interceptor.Priority.APPLICATION)
public class SecurityCheckInterceptor implements Serializable {
@Inject
SecurityService secutiyService;
@AroundInvoke
public Object securityIntercept(InvocationContext ic) throws Exception {
String target = // build the fully qualified method name from ic
System.out.println("---- ENTER: ["+target+"]");
Object out = ic.proceed();
System.out.println("---- EXIT: ["+target+"]");
return out;
}
}
这些是我在JSF bean类中使用拦截器的两种选择:
// METHOD N. 1
@Named
@ViewScoped
public class IndexController implements Serializable {
...
@Interceptors({SecurityCheckInterceptor.class})
public void doAction() {
System.out.println("indexController.doAction()");
}
}
和
// METHOD N. 2
@Named
@ViewScoped
public class IndexController implements Serializable {
...
@SecurityCheck
public void doAction() {
System.out.println("indexController.doAction()");
}
}
当我使用方法N.1时,输出如下:
---- ENTER: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
indexController.doAction()
---- EXIT: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
所以一切都如预期,但使用方法n.2(我更喜欢)输出如下:
---- ENTER: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
---- ENTER: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
indexController.doAction()
---- EXIT: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
---- EXIT: [it.univaq.we2018.tutor.controller.IndexController.doAction()]
拦截器在"嵌套"中被调用两次。时尚。 这是一个错误吗?我错过了什么吗? 我使用的是Java 1.8_172,Payara 5.181,NetBeans 8.2和JavaEE 7配置文件。该应用程序基于javaee7 maven原型。所有注释都是CDI而不是JSF注释(例如ViewScoped)。
谢谢。