CDI Transactional Interceptor不与CDI Producer

时间:2015-11-05 12:40:15

标签: java cdi interceptor weld

我在this post中引用了一个类似的问题:

但是,我需要使用producer方法来创建复杂对象(这个对象在构造函数中接收两个参数)。使用producer方法失去对拦截器的引用。我在CDI的规范中没有发现任何内容,他们说拦截器不会对生产者方法生成的对象执行。

我的问题是:它可能使用生成器方法并使用拦截器保持引用?

1 个答案:

答案 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本身之间使用模糊的be​​an解析,您可以通过在bean和producer类的实例字段中添加另一个限定符来解析它。

希望这会有所帮助。 -Juuso