我在this post中引用了一个类似的问题:
但是,我需要使用producer方法来创建复杂对象(这个对象在构造函数中接收两个参数)。使用producer方法失去对拦截器的引用。我在CDI的规范中没有发现任何内容,他们说拦截器不会对生产者方法生成的对象执行。
我的问题是:它可能使用生成器方法并使用拦截器保持引用?
答案 0 :(得分:0)
CDI拦截器和装饰器仅适用于由CDI容器实例化的bean。
然而,有一个丑陋的解决方法。这有点技术性,但请耐心等待。我写的主要是没有IDE,所以我为拼写错误道歉,这只是为了给你一个想法。
首先,您需要创建限定符
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER})
public @interface InjectionParameter {
int value();
}
然后你需要像这样注释你的特殊构造函数:
@Inject
public MyClass(@InjectionParameter(1) Object firstParam, @InjectionParameter(2) Object secondParameter)
然后为你的制作人说
@Inject
private Instance<MyClass> myClassInstance;
@Produces
@InjectionParameter(1)
Object firstParam;
@Produces
@InjectionParameter(2)
Object secondParam;
@Produces MyClass producer() {
firstParam = null; /* set your first param here */
secondParam = null; /* set your second param here */
return myClassInstance.get();
}
请注意,我对Object的使用只是一个示例,请替换为您自己的实际类型:)
关键是CDI容器CAN实例化没有默认构造函数的bean,只要正确的构造函数使用@Inject 注释并且每个参数都是有效的注入目标。 我在那里做的是通过生产者字段设置bean的参数。
请注意,我实际上并未使用CDI容器对其进行测试,因此您可能需要对该解决方案进行微调。您最终可能会在生成器方法和bean本身之间使用模糊的bean解析,您可以通过在bean和producer类的实例字段中添加另一个限定符来解析它。
希望这会有所帮助。 -Juuso