Я использую перехватчики CDI, и я понял, что только первый вызов метода в классе, аннотированном с помощью @Interceptor, перехвачен. В приведенном ниже примере метод B никогда не перехватывается.Java CDI. Перехватчик вызывается только при первом вызове метода в классе
@InterceptorBinding
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Transactional {
}
@Transactional
@Interceptor
public class TransactionsInterceptor {
@AroundInvoke
public Object transactionInterceptor(InvocationContext context) throws Exception {
System.out.println("Method="+context.getMethod().getName());
return context.proceed();
}
}
public Interface AnImportantInterface {
public void methodA();
public void methodB();
}
@Transactional
@ThreadScoped
public class AnImportantClass implements AnImportantInterface {
public void methodA() {
methodB();
}
public void methodB() {
//This method is never intercepted
}
}
public class AnotherImportantClass {
@Inject AnImportantInterface aui;
public void someMethod() {
aui.methodA();
}
}
Как я могу достичь этого методаB быть перехваченным, если метод А вызывается первым? есть ли какое-то обходное решение?
В основном исправлено, хотя его ценность заключается в том, что самоинъекция не предусмотрена в качестве функции в спецификации CDI. –
@JohnAment. Поскольку вы указываете, что самоинъекция не предусмотрена в текущей спецификации CDI, хотя это не то, на что я получаю ответы, если она была поддержана (как в спецификации EJB), это сделало бы для более чистого решения. Для тех, кого интересует RFE для этого: https://issues.jboss.org/browse/CDI-414 – NBW