繁体   English   中英

CDI拦截器:如何拦截`this`调用或获取当前代理对象?

[英]CDI Interceptors: How to intercept `this` calls or get the current proxy object?

我有一个用户将继承的类,并实现两个方法: navigateForwards()navigateBackwards() (它是一个类似向导的Web应用程序)。 用户可能想要将拦截器添加到这些方法中。

另一个类(假设它是框架的一部分)将找到适当的子类, select()它并调用navigate(String)方法,该方法将调用navigateForwards()navigateBackwards() 此时拦截器将不再起作用,因为它是一个未经过代理的方法调用。 我可以在navigate()方法中添加拦截器,但这不是子类对覆盖感兴趣的方法。

是否有一种简单的方法告诉CDI拦截一种否则不会被截获的方法?

我提出了一些解决这个问题的一般方法,但它们似乎都不是很有希望:

  1. 不知怎的,得到了​​叫我的代理对象。 这需要某种自我注入来复制“框架”类中的select()调用。

  2. 从CDI获取方法的拦截器列表并手动调用它们。 不知何故。

  3. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM