Jsf 拦截CDIBeans中的私有方法
我有一个包含私有方法的CDIBean。我编写了一个拦截器,如下所示: 拦截器代码: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();
@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的所有高级功能(事务、锁定、拦截器)只适用于外部调用。