java produces_java – @Produces @Named给出了一个WELD-001408

本文档探讨了在使用Java CDI时遇到的WELD-001408错误,该错误涉及@Produces和@Named注解。通过一个测试用例展示了如何通过@AdditionalClasses解决未扫描到的依赖问题,同时解释了为何会出现不明确的依赖问题,并提出了解决方案,即在注入时指定@Named的值。
摘要由CSDN通过智能技术生成

我试图了解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()]

最佳答案 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值