我有一些豆子,在特定的注射中,我想添加一个给定的拦截器。
我天真地以为有类似@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;
到目前为止我尝试的是
AnnotatedType
(在BeforeBeanDiscovery事件期间)(创建类型,但不能与初始类型真正区分)并给予AnnotatedType
拦截器绑定注释。 AnnotatedType
的Bean,并为其提供所需的限定符注释所有人似乎都很谨慎,除了它是注入的原始豆。
我当然可以用截取的一个替换原始的,但是在某些情况下不需要这样的拦截,所以我必须保持两个AnnotatedType
引用相同的具体类型。我想我可以在CDI中做到这一点,但它似乎不起作用(因为原始类型永远不会被截获的类型取代)。
答案 0 :(得分:2)
您需要做什么:
ProcessAnnotatedType
生命周期事件中的类型。您需要致电getAnnotatedType
,添加注释,然后拨打setAnnotatedType
。我强烈建议您查看AnnotatedTypeBuilder
的{{3}}或Seam Solder项目,以便更轻松。答案 1 :(得分:0)
可能你可以尝试使用MyInterceptedBean列出拦截器的@Inject MyInterceptedBean instance;
吗?
(警告:这不是看起来正确,但是,对于仅在注释方面有所不同的类型使用继承...当它始终是两个声明的相同的注释时可能是可接受的并且在每种情况下没有不同的注释。)