【问题标题】:@Produces @Named gives a WELD-001408@Produces @Named 给出了 WELD-001408
【发布时间】:2017-06-29 12:25:24
【问题描述】:

我试图了解 CDI,在本例中是注释 @Produces@Named

我有以下代码

@RunWith(CdiRunner.class)
public class cdiTest {

@Inject
protected CDIModel em;

@Test
public void injectionTest(){
    Assert.assertEquals("this", em.getMyString());
}

}

public class CDIModel {

String myString;

public CDIModel(String myString) {
    this.myString = myString;
}

public String getMyString() {
    return myString;
}
}

public class EntityProducer {

@Produces
@Named("this")
@Singleton
public CDIModel doThis() {
    return new CDIModel("this");
}

@Produces
@Named("that")
@Singleton
public CDIModel doThat() {
    return new CDIModel("that");
}

}

我为什么会得到

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied 
dependencies for type CDIModel with qualifiers @Named
  at injection point [UnbackedAnnotatedField] @Inject @Named protected 
persistence.dao.cdiTest.em
  at persistence.dao.cdiTest.em(cdiTest.java:0)

添加@AdditionalClasses(EntityProducer.class) 后我得到了

org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous 
dependencies for type CDIModel with qualifiers @Default
at injection point [UnbackedAnnotatedField] @Inject protected 
dk.nykredit.lanc.persistence.dao.cdiTest.em
at dk.nykredit.lanc.persistence.dao.cdiTest.em(cdiTest.java:0)
Possible dependencies: 
- Producer Method [CDIModel] with qualifiers [@Default @Named @Any] declared 
as [[BackedAnnotatedMethod] @Produces @Named @Singleton public 
persistence.dao.EntityProducer.doThat()],
- Producer Method [CDIModel] with qualifiers [@Default @Named @Any] declared 
as [[BackedAnnotatedMethod] @Produces @Named @Singleton public 
persistence.dao.EntityProducer.doThis()]

【问题讨论】:

    标签: java cdi weld


    【解决方案1】:

    CDI-Unit 不会扫描所有类,因此它不知道 EntityProducer 类。因此,您必须手动添加要被 CDI 扫描的类/包。

    你可以使用@AdditionalClasses注解:

    @RunWith(CdiRunner.class)
    @AdditionalClasses(EntityProducer.class)
    public class cdiTest {
        ....
        ....
    
    }
    

    编辑

    然后你得到一个模棱两可的依赖,因为你没有正确地限定你的注入。您应该在测试类中使用@Named("this")@Named("that")

    @Inject
    @Named("this") // or @Named("that")
    protected CDIModel em;
    

    另请注意,在 CDI 中,我们通常使用 @Qualifier 而不是 @Named

    【讨论】:

    • 那做了一些事情,但现在我收到了 2 个生产方法的 WELD-001409。我已经编辑了初始文本以显示错误
    猜你喜欢
    • 2015-02-09
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2013-10-15
    相关资源
    最近更新 更多