Я создал простое ушное приложение, состоящее из 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).
Спасибо.