如何在注入时指定拦截器

时间:2012-01-13 09:18:02

标签: java cdi interceptor jboss-weld

我有一些豆子,在特定的注射中,我想添加一个给定的拦截器。

我天真地以为有类似@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;

到目前为止我尝试的是

  • 使用反射库检测需要进行注射的区域(有效)
  • 使用seam焊接从bean类创建AnnotatedType(在BeforeBeanDiscovery事件期间)(创建类型,但不能与初始类型真正区分)并给予AnnotatedType拦截器绑定注释。
  • 使用焊缝(再次)创建来自生成的AnnotatedType的Bean,并为其提供所需的限定符注释

所有人似乎都很谨慎,除​​了它是注入的原始豆。

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

2 个答案:

答案 0 :(得分:2)

您需要做什么:

  1. 将拦截器添加到beans.xml,以便激活
  2. 创建一个扩展,将拦截器绑定或拦截器注释添加到ProcessAnnotatedType生命周期事件中的类型。您需要致电getAnnotatedType,添加注释,然后拨打setAnnotatedType。我强烈建议您查看AnnotatedTypeBuilder的{​​{3}}或Seam Solder项目,以便更轻松。

答案 1 :(得分:0)

可能你可以尝试使用MyInterceptedBean列出拦截器的@Inject MyInterceptedBean instance;吗?

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