通过@Produces 将@Named 限定符添加到现有bean 时的CDI 不明确依赖
CDI ambiguous dependency when adding @Named qualifier to existing bean via @Produces
我在依赖 jar 文件中有一个 CDI bean 实现:
@ApplicationScoped
public class MyService {
public String doSomething() {...}
}
在我的网络应用程序中,我想通过 EL 表达式访问该服务,因此我必须给它一个 @Named
注释。但是我无法在 MyService
实现上添加注释,因为我无权更改该代码。
因此我尝试创建一个像
这样的制作人
public class MyServiceProducer {
@Inject MyService myService;
@Produces @Named("myService")
public MyService produceNamedInstance() {
return myService;
}
}
这导致
WELD-001409 - ambiguous dependency for type MyService with qualifiers @Default
...
Possible dependencies:
- Managed Bean [class ...MyService] with qualifiers [@Any @Default]
- Producer Method [myService] with qualifiers [@Default @Named @Any] declared as [...]
如何在不触及原始源代码的情况下添加 @Named
注释?
错误指的是 @Inject MyService
。您基本上通过 @Produces MyService
定义了第二个 bean,它是 也 可注入的 MyService
,但您没有明确表示要通过 [= 注入哪个14=]。所以 CDI 感到困惑并抛出这个不明确的依赖错误。
与其为已经自动生成的 bean 创建另一个生产者,不如扩展现有的 bean 然后命名它。
@Named("myService")
public class MyNamedService extends MyService {
//
}
注意到应该是scope is already @Inherited
,所以你不需要重新定义它。
我在依赖 jar 文件中有一个 CDI bean 实现:
@ApplicationScoped
public class MyService {
public String doSomething() {...}
}
在我的网络应用程序中,我想通过 EL 表达式访问该服务,因此我必须给它一个 @Named
注释。但是我无法在 MyService
实现上添加注释,因为我无权更改该代码。
因此我尝试创建一个像
这样的制作人public class MyServiceProducer {
@Inject MyService myService;
@Produces @Named("myService")
public MyService produceNamedInstance() {
return myService;
}
}
这导致
WELD-001409 - ambiguous dependency for type MyService with qualifiers @Default ... Possible dependencies: - Managed Bean [class ...MyService] with qualifiers [@Any @Default] - Producer Method [myService] with qualifiers [@Default @Named @Any] declared as [...]
如何在不触及原始源代码的情况下添加 @Named
注释?
错误指的是 @Inject MyService
。您基本上通过 @Produces MyService
定义了第二个 bean,它是 也 可注入的 MyService
,但您没有明确表示要通过 [= 注入哪个14=]。所以 CDI 感到困惑并抛出这个不明确的依赖错误。
与其为已经自动生成的 bean 创建另一个生产者,不如扩展现有的 bean 然后命名它。
@Named("myService")
public class MyNamedService extends MyService {
//
}
注意到应该是scope is already @Inherited
,所以你不需要重新定义它。