【问题标题】:Java CDI select alternative without priorityJava CDI 选择无优先级的替代方案
【发布时间】:2020-05-23 00:20:00
【问题描述】:

我正在尝试将 DeltaSpike (LocaleResolver) 提供的默认实现替换为我自己通过@Alternative 提供的实现。

@Alternative
@RequestScoped
public class ExampleLocaleResolver implements LocaleResolver {

}
<alternatives>
  <class>org.example.app.ExampleLocaleResolver</class>
</alternatives>

似乎使ExampleLocaleResolver 成为选定bean 的唯一方法是使用@Priority@Specializes

例如,以下两个工作得很好:

@Priority(1)
@Alternative
@RequestScoped
public class MyLocaleResolver implements LocaleResolver {

}
@Specializes
@RequestScoped
public class MyLocaleResolver extends DefaultLocaleResolver {

}

我的理解是,使用 CDI 1.1+,应该可以用替代方案覆盖库中的 bean,而无需任何黑客攻击。

有人可以帮我理解为什么我无法在没有 @Priorty 注释的情况下注入 @Alternative bean 吗?

【问题讨论】:

    标签: java cdi weld deltaspike


    【解决方案1】:

    (警告:我在@Alternative领域比较弱,但我想我理解这个并且可以准确回答。)

    我认为问题在于,如果不使用 @Priority,您只能对 bean 存档进行断言,并且您的 bean 存档与 DeltaSpike LocaleResolver 的来源 bean 存档不同。我的理解是in CDI 1.1+ the only way to cause application-wide @Alternative selection to happen is with the @Priority annotation

    【讨论】:

    • 谢谢您的解释,文档澄清了一切。我知道 CDI 1.1 允许全局替代方案,但我只是不知道启用该功能需要优先级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多