@Produces @Named 给出了 WELD-001408
@Produces @Named gives a WELD-001408
我正在努力了解 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 不会扫描所有 classes,因此它不知道 EntityProducer
class。所以你必须手动添加你想要被CDI扫描的classes/packages。
您可以使用 @AdditionalClasses
注释:
@RunWith(CdiRunner.class)
@AdditionalClasses(EntityProducer.class)
public class cdiTest {
....
....
}
编辑
然后你得到了一个不明确的依赖关系,因为你没有正确地限定你的注入。你应该在测试中使用 @Named("this")
或 @Named("that")
class :
@Inject
@Named("this") // or @Named("that")
protected CDIModel em;
另请注意,在CDI中我们通常使用@Qualifier
而不是@Named
我正在努力了解 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 不会扫描所有 classes,因此它不知道 EntityProducer
class。所以你必须手动添加你想要被CDI扫描的classes/packages。
您可以使用 @AdditionalClasses
注释:
@RunWith(CdiRunner.class)
@AdditionalClasses(EntityProducer.class)
public class cdiTest {
....
....
}
编辑
然后你得到了一个不明确的依赖关系,因为你没有正确地限定你的注入。你应该在测试中使用 @Named("this")
或 @Named("that")
class :
@Inject
@Named("this") // or @Named("that")
protected CDIModel em;
另请注意,在CDI中我们通常使用@Qualifier
而不是@Named