Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 拦截CDIBeans中的私有方法_Jsf_Cdi_Interceptor - Fatal编程技术网

Jsf 拦截CDIBeans中的私有方法

Jsf 拦截CDIBeans中的私有方法,jsf,cdi,interceptor,Jsf,Cdi,Interceptor,我有一个包含私有方法的CDIBean。我编写了一个拦截器,如下所示: 拦截器代码: @Interceptor @TimeMeasure public class TimeWatcher implements Serializable { @AroundInvoke public Object logMethodEntry(InvocationContext ctx) throws Exception { long t0 = System.nanoTime();

我有一个包含私有方法的CDIBean。我编写了一个拦截器,如下所示:

拦截器代码:

@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 {

    }
只有在外部调用的公共方法中,一切都可以正常工作,若我从CDIBean内部调用该方法,那个么它就不工作了。我使用JSF2.0 MyFaces和Omnifaces来完成@ViewScoped


提前谢谢。

这是精心设计的。内部电话永远不会被拦截。

非常感谢。你能告诉我你从哪里知道的吗?我没有发现Oracle手册中提到过它。我必须阅读规范才能了解这些细微差别吗?我没有规范/参考,但使用CDI,您只能拦截生命周期和业务方法,即对CDIBean的外部调用。拦截器通常由动态代理(decorator模式)实现——因此内部调用通常不会被拦截。对于从bean中调用的公共方法(但可能依赖于实现…),这也应该/可能失败。关于这些“细微差别”,请记住,CDI/EJB bean的所有高级功能(事务、锁定、拦截器)只适用于外部调用。