我在依赖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
注释?
答案 0 :(得分:1)
错误是指@Inject MyService
。您基本上通过@Produces MyService
定义了第二个bean,也可注射为MyService
,但是您没有明确指出要通过@Inject
注入哪一个。所以CDI感到困惑,并引发了这种模糊的依赖错误。
不应为已经自动生成的bean创建另一个生成器,而应该扩展现有的bean,然后命名它。
@Named("myService")
public class MyNamedService extends MyService {
//
}
注意scope已经是@Inherited
,因此您无需重新定义它。