2017-06-29 33 views
4

我试图让我的周围CDI头,在这种情况下,注释@Produces@Named@Produces @Named给人以WELD-001408

我有以下代码

@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()] 

回答

1

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

可以使用@AdditionalClasses注释:

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

} 

编辑

然后你得到了一个ambigous依赖,因为你没有适当资格的注入。您应该使用@Named("this")@Named("that")在测试类:

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

还要注意的是,在CDI我们平时使用@Qualifier代替@Named

+0

也做了,但现在我收到WELD-001409在2产生方法。我编辑了初始文本以显示错误 – stuf99

+0

我编辑了我的答案 – Rouliboy

+0

太好了,解决了它,Thx :-) – stuf99