2
У меня есть CDI bean с частным методом внутри него. Я написал перехватчик как следующее:Перехватить частные методы внутри CDI beans
код перехватчика:
@Interceptor
@TimeMeasure
public class TimeWatcher implements Serializable {
@AroundInvoke
public Object logMethodEntry(InvocationContext ctx) throws Exception {
long t0 = System.nanoTime();
try {
return ctx.proceed();
} finally {
long dt = System.nanoTime() - t0;
System.out.println("Method execution time: " + ctx.getMethod().getName() + " - " + dt);
}
}
}
код аннотацию в:
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface TimeMeasure {
}
Все отлично работает только для открытых методов, которые называются внешними, если вызвать метод внутри CDI bean не работает. Я использую JSF 2.0 MyFaces вместе с Omnifaces для выполнения @ViewScoped
Спасибо заранее.
спасибо. Можете ли вы сказать, откуда вы это знаете? Я не нашел это в руководстве Oracle. Должен ли я читать спецификации, чтобы знать такие нюансы? – Anatoly
У меня нет спецификации/ссылки для этого, но с CDI вы можете перехватывать жизненный цикл и бизнес-методы, т. Е. Внешние вызовы на ваш CDI-компонент. Перехватчики часто реализуются динамическими прокси (шаблон декоратора). Поэтому внутренние вызовы обычно не могут быть перехвачены. Это должно/может также выходить из строя для общедоступных методов, вызываемых из вашего компонента (но может быть зависимым от реализации ...). Что касается таких «нюансов», просто помните, что все причудливые вещи (транзакции, блокировка, перехватчики) для CDI/EJB beans работают только для внешних вызовов. –