通过@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,所以你不需要重新定义它。