我在运行时通过我的应用程序中的producer
提供注入服务接口的实现。
最近,协作团队中的某个人创建了相同服务接口的另一个实现,并且该类已添加到我的应用程序中无法避免的jar中。因此抛出ambiguous dependency exception
,我可以通过生产者方法和注入点上的CDI限定符来解决这个问题。我想问是否有任何其他方法可以避免这种开销。我可以使用我的@Produces
方法作为默认实现来使容器忽略第二个实现吗?我在生成器方法上添加了@Default
注释和@Produces
注释,以检查这是否解决了问题,因为默认情况下每次注入都使用@Default
进行注释。但那没用。
答案 0 :(得分:1)
您可以使用以下选项来避免为新实现创建新限定符的开销。
使用内置限定符@Named
,它允许您通过String指定实现。 (但它不使用CDI型安全注射功能)
创建一个具有enum属性的限定符。每个枚举值代表一个实现。要注入的实现由此enum属性指定。 (注射是类型安全的。有关示例,请参阅this)
答案 1 :(得分:0)
如果你不能使用@Vetoed
注释第二个实现,我会编写一个CDI扩展,通过ProcessAnnotatedType
private void vetoSecondImpl(@Observes ProcessAnnotatedType<YourSecondImpl> pat) {
pat.veto();
}
以下是规范的参考:http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#init_events