2014-11-04 3 views
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

Спасибо заранее.

ответ

5

Это по дизайну. Внутренние вызовы никогда не могут быть перехвачены.

+0

спасибо. Можете ли вы сказать, откуда вы это знаете? Я не нашел это в руководстве Oracle. Должен ли я читать спецификации, чтобы знать такие нюансы? – Anatoly

+1

У меня нет спецификации/ссылки для этого, но с CDI вы можете перехватывать жизненный цикл и бизнес-методы, т. Е. Внешние вызовы на ваш CDI-компонент. Перехватчики часто реализуются динамическими прокси (шаблон декоратора). Поэтому внутренние вызовы обычно не могут быть перехвачены. Это должно/может также выходить из строя для общедоступных методов, вызываемых из вашего компонента (но может быть зависимым от реализации ...). Что касается таких «нюансов», просто помните, что все причудливые вещи (транзакции, блокировка, перехватчики) для CDI/EJB beans работают только для внешних вызовов. –

Смежные вопросы