在CDI

时间:2016-09-13 19:30:34

标签: java java-ee cdi

我已经开始阅读Java EE7中的Beginning,目前正在忙于CDI这一章。 我的替代课程如下所示。

@Alternative
@ThirteenDigits
public class MockGenerator implements NumberGenerator {

@Inject
private Logger logger;

@Loggable
public String generatorNumber() {
    String mock = "MOCK-" + Math.abs(new Random().nextInt());
    logger.info("Generated mock : " + mock);
    return mock;
}
}

我使用的其他依赖类如下

@ThirteenDigits
public class IsbnGenerator implements NumberGenerator {

@Inject
private Logger logger;

@Loggable
public String generatorNumber() {
    String isbn = "13-84356-" + Math.abs(new Random().nextInt());
    logger.info("Generated ISBN : " + isbn);
    return isbn;
}

}

我的beans.xml文件如下所示。

 <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org.2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/sml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">

<alternatives>
    <class>com.narotech.MockGenerator</class>
</alternatives>
<interceptors>com.narotech.LoggingInterceptor</interceptors>
</beans>

我的注射代码如下。

@Inject 
@ThirteenDigits
private NumberGenerator numberGenerator;

public Book createBook(String title, Float price, String description) {
    Book book = new Book(title, price, description);

    book.setNumber(numberGenerator.generatorNumber());
    return book;
}

现在,我不确定原因,但是当我运行JUnit测试时,我得到了#34; 13-84356-683584002&#34;而不是&#34; MOCK-84356-683584002&#34;。谁能告诉我我做错了什么。如果您需要我提供更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。我只是在MockGenerator类中添加了@Priority注释。

答案 1 :(得分:0)

@Priority是解决问题的一种方法,但是您也可以使用@Specializes作为更简单的机制: https://docs.oracle.com/javaee/6/tutorial/doc/gjsdf.html#gkhpo