拦截CDI bean中的私有方法

问题描述:

我有一个CDI bean,里面有私有方法。我已经写了一个拦截器,像下面:拦截CDI bean中的私有方法

拦截器的代码:

@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

谢谢您提前。

这是设计。内部呼叫永远不会被拦截。

+0

非常感谢。你能说说你从哪里知道吗?我没有在Oracle手册中找到它。我是否必须阅读规格才能了解这些细微差别? – Anatoly 2014-11-04 18:41:13

+1

我没有这方面的规范/参考,但是对于CDI,您只能截取生命周期和业务方法,即对CDI bean的外部调用。拦截器通常由动态代理(装饰器模式)实现 - 因此通常不会拦截内部调用。对于从你的bean中调用的公共方法,这应该/也可能会失败(但可能依赖于实现)。关于这种“细微差别”,只要记住CDI/EJB bean的所有花哨的东西(事务,锁定,拦截器)仅适用于外部调用。 – 2014-11-04 21:00:18