[英]CDI Interceptors: How to intercept `this` calls or get the current proxy object?
我有一个用户将继承的类,并实现两个方法: navigateForwards()
和navigateBackwards()
(它是一个类似向导的Web应用程序)。 用户可能想要将拦截器添加到这些方法中。
另一个类(假设它是框架的一部分)将找到适当的子类, select()
它并调用navigate(String)
方法,该方法将调用navigateForwards()
或navigateBackwards()
。 此时拦截器将不再起作用,因为它是一个未经过代理的方法调用。 我可以在navigate()
方法中添加拦截器,但这不是子类对覆盖感兴趣的方法。
是否有一种简单的方法告诉CDI拦截一种否则不会被截获的方法?
我提出了一些解决这个问题的一般方法,但它们似乎都不是很有希望:
不知怎的,得到了叫我的代理对象。 这需要某种自我注入来复制“框架”类中的select()调用。
从CDI获取方法的拦截器列表并手动调用它们。 不知何故。
使用DeltaSpike的EnableInterceptorsProxyFactory http://deltaspike.apache.org/documentation/proxy.html来包装this
。 这可能很慢和/或发现其他限制。
CDI扩展可能还有另一种选择,但我不确定扩展能够做什么。
我已经尝试将所有内容颠倒过来并使用装饰器而不是基类,希望对委托对象的调用会被拦截,但事实并非如此,至少在JBoss EAP 6.x中没有(很可能是6.4) ,但是当我测试时它可能是早期版本)。
我找到的最简单的解决方案(由于某些模糊的原因以前没有发生过我)是使navigate()
静态并明确地传递对象(例如作为self
)。
从外面看,类有点奇怪,因为看起来它可能有一个常规的非静态方法,但有一个静态方法。 OTOH它完成了工作并且易于理解。 我需要当前的代理对象,所以我将其传入。它是微不足道的,它保持拦截器行为。
在我的项目中只需要更改一些调用,但其他项目将有不同的需求,因此不幸的是它不是一般的解决方案。 这就是我不接受自己答案的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.