【问题标题】:CDI Transactional Interceptor not working with CDI ProducerCDI 事务拦截器不与 CDI 生产者一起使用
【发布时间】:2016-02-06 07:15:29
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您有同样的问题,其他问题的答案应该可以回答您的问题。如果您有其他问题,请发布代码 sn-ps、您尝试过的内容以及遇到的错误类型,以帮助人们回答您的问题。因为你的问题很难回答。另见stackoverflow.com/help/how-to-ask
  • 我编辑了一个问题来清除它。

标签: java cdi interceptor weld


【解决方案1】:

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容器可以实例化没有默认构造函数的bean,只要正确的构造函数用@Inject注释并且每个参数都是一个有效的注入目标。 我在那里做的是通过生产者字段设置你的bean的参数。

请注意,我实际上并未使用 CDI 容器对此进行测试,因此您可能需要对解决方案进行微调。您最终可能会在生产者方法和 bean 本身之间得到不明确的 bean 解析,您可以通过在 bean 和生产者类的实例字段中放置另一个限定符来解决这个问题。

希望这会有所帮助。 -Juuso

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2014-03-10
    • 2020-06-17
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多