CDI 1.1 Interceptor / InterceptorBinding调用了两次

时间:2018-06-07 10:18:12

标签: cdi interceptor java-ee-7 payara

我构建了一个由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)。

谢谢。

0 个答案:

没有答案