CDI 1.1 Interceptor / InterceptorBinding вызывается дважды - PullRequest
0 голосов
/ 07 июня 2018

Я создал простое ушное приложение, состоящее из EJB и модуля WAR.Я использую перехватчик CDI, чтобы перехватить вызов к действиям JSF, чтобы сделать некоторую операцию.Все работает нормально, за исключением странного поведения, которое возникает, когда я аннотирую метод действия, используя аннотацию перехватывания.Чтобы быть более точным, вот код:

Это класс ожидания перехватчика

@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:

// 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).

Спасибо.

...