通过@Produces将@Named限定符添加到现有bean时,CDI模糊不清

时间:2016-07-15 08:06:28

标签: java-ee cdi managed-bean named

我在依赖jar文件中有一个CDI bean实现:

@ApplicationScoped
public class MyService {
  public String doSomething() {...}
}

在我的webapp中,我想通过EL Expression访问该服务,因此我必须给它一个@Named注释。但我无法在MyService实施中添加注释,因为我没有权利更改该代码。

因此我尝试创建像

这样的制作人
public class MyServiceProducer {
  @Inject MyService myService;

  @Produces @Named("myService")
  public MyService produceNamedInstance() {
    return myService;
  }
}

这导致

  

WELD-001409 - 带有限定符@Default的MyService类型的模糊依赖       ...       可能的依赖关系:        - 带有限定符的托管Bean [class ... MyService] [@Any @Default]        - 生产者方法[myService],带有限定符[@Default @Named @Any],声明为[...]

如何在不触及原始源代码的情况下添加@Named注释?

1 个答案:

答案 0 :(得分:1)

错误是指@Inject MyService。您基本上通过@Produces MyService定义了第二个bean,可注射为MyService,但是您没有明确指出要通过@Inject注入哪一个。所以CDI感到困惑,并引发了这种模糊的依赖错误。

不应为已经自动生成的bean创建另一个生成器,而应该扩展现有的bean,然后命名它。

@Named("myService")
public class MyNamedService extends MyService {
    //
}

注意scope已经是@Inherited,因此您无需重新定义它。