【问题标题】:How to specify interceptor at inject time如何在注入时指定拦截器
【发布时间】:2012-02-09 12:27:48
【问题描述】:

我有一些 bean,在特定的注入中,我想为其添加一个给定的拦截器。

我天真地认为有类似 @Interceptors 注释的东西可以让我写作

private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance;

不幸的是,Weld documentation 明确表示相反。

那么,我如何注入截获的 bean 版本?是否可以使用 cdi Instance 对象?

编辑

虽然 LightGuard 的回答确实相关,但它并不能完全回答我的问题,所以让我重新表述一下。

我想要一个触发某种方法调用事件发送的注释。为此,我创建了一个 CDI Interceptor,并带有自己的拦截器绑定(假设拦截器称为 SenderInterceptor,绑定称为 SenderBinding)。我现在想要的是添加一个 CDI 限定符(我们称之为 SenderQualifier),当用于注入时,它会安装 SenderInterceptor

为了更清楚,我希望下面的代码使用SenderInterceptor

/* calling any method of that bean should trigger an event */
private @Inject @SenderQualifier MyBean aBean;

虽然这个没有

private @Inject MyBean aBean;

到目前为止我尝试的是

  • 使用反射库(有效)检测需要这些注入的字段
  • 使用焊缝从 bean 类创建 AnnotatedType(在 BeforeBeanDiscovery 事件期间)(类型已创建,但与初始类型没有真正的区别)并为 AnnotatedType 提供拦截器绑定注释。
  • 使用焊缝(再次)从生成的 AnnotatedType 创建一个 Bean,并为其提供所需的限定符注释

似乎一切正常,除了注入的是原始 bean。

我当然可以用拦截的替换原始的,但是在某些情况下不需要这样的拦截,所以我必须保持 AnnotatedType 引用相同的具体类型。我在想我可以在 CDI 中这样做,但它似乎不起作用(因为原始类型永远不会被截获的类型取代)。

【问题讨论】:

    标签: java cdi interceptor jboss-weld


    【解决方案1】:

    你需要做什么:

    1. 将拦截器添加到 beans.xml 以便它被激活
    2. 创建一个扩展,在ProcessAnnotatedType生命周期事件中为类型添加拦截器绑定或拦截器注解。您需要调用getAnnotatedType,添加注释,然后调用setAnnotatedType。我强烈建议您查看 Seam SolderApache DeltaSpike 项目的 AnnotatedTypeBuilder 以简化此操作。

    【讨论】:

    • 我第一次听说这些项目。为此以及可以添加的方式+1。但是,我想我实际上应该在现有类型旁边添加类型,而不是简单地替换它们
    • 事实上,在我的情况下,AnnotatedTypeBuilder 应该在BeforeBeanDiscovery 事件处理方法中使用(因为ProcessAnnotatedType 不允许类型添加,而只允许类型替换)。
    • 抱歉,@LightGuard,但我必须将您的回答标记为未回答。
    • 你可以用新的注释替换类型,这就是你想要做的。添加一个新类型会给你一个模棱两可的例外。
    • 好的,现在我明白了。不,您想做的事情是不可能的,您必须对原始类型进行注释,或者根据具体类型创建新的注释类型。您当然需要为类型和注入添加限定符,以确保注入正确的实例。刻板印象似乎适合该部分。
    【解决方案2】:

    您可以尝试@Inject MyInterceptedBean instance;,其中拦截器与 MyInterceptedBean 一起列出?

    (警告:这并不看起来正确,但是,对仅在注释中不同的类型使用继承......当它始终是两个声明的 same 注释时可能可以接受并且在每种情况下都没有不同的注释。)

    【讨论】:

    • 好吧,就我而言,我什至不能使用它,因为某些 bean 是通过其他 CDI 扩展 (JNDIExtension discussed here) 加入的远程 bean
    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2019-01-14
    • 2020-05-08
    相关资源
    最近更新 更多