gpt4 book ai didi

java - CDI 注入(inject)不明确的依赖关系 "pick any, i don' t care"

转载 作者:行者123 更新时间:2023-11-30 02:49:28 26 4
gpt4 key购买 nike

我的一个类有一个使用 @EJB 注释声明的属性。两颗 bean 符合条件,所以我得到了一个不错的org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies .

我知道这可以通过限定符来解决。但这会让我选择一种 EJB 实现而不是另一种。但我并不关心使用哪一个。有没有一种简单的方法告诉 CDI“选择两个符合条件的实现中的任何一个,我不在乎,两者都很好”?

最佳答案

... a simple way to tell CDI "Pick any of the two eligible implementations, I don't care and both are fine"

不,没有。这将违背 CDI 试图实现的目标。这是为什么会这样的高峰......

一种情况可能是您的 bean 是 session bean。在这种情况下,为该注入(inject)点拥有两个合适的 bean 并不意味着它们在您请求它们的给定时刻存在。不用说,它们可能不会携带您期望它们拥有的数据/状态。

另一个原因是 CDI 有一个底层代理系统 - 每个 @Inject ed bean 实际上是该 bean 的代理对象。为了避免在运行时出现奇怪的 NPE 和异常,CDI 需要在启动时知道什么是适合您的注入(inject)点的 one Bean。

另一点可能是您可以注入(inject)的 Bean 的不同生命周期管理。这会产生更奇怪的运行时错误。

最后但并非最不重要的一点是,想象一下您的应用程序变得越来越大。有人添加了您要注入(inject)的类型的第三种实现,而该实现对于您想要实现的目标来说不太好。那么会发生什么?

这就是我的想法。至于要走的路,可以用Instance<MyBean>或通过 BeanManager 解决。以下是 Instance 的片段这可能是更好的方法。

@Inject
private Instance<Foo> foo;

public void doStuff() {
foo.isAmbiguous(); //you can check if there are more beans eligible for injection here
foo.isResolvable(); //yet another useful check you might want

// there are multiple selects you can use - based on type, annotation or both
//select based on annotation (parameter is annotation INSTANCE), with this you require a Foo type with @Default qualifier
foo.select(Default.Literal.INSTANCE).get();

//select based on requested type, here you are asking for a Foo bean which also has a type MyType (implements interface or extends class with that type for instance)
foo.select(MyType.class).get();

// combined - type and annotation
foo.select(MyType.class, Default.Literal.INSTANCE).get();
}

注意:使用 Instance<X> 时方法get()是实际分辨率并为您提供结果 bean 的结果。

关于java - CDI 注入(inject)不明确的依赖关系 "pick any, i don' t care",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com