容器是玻璃鱼4.1
我现在与CDI有一个非常奇怪的问题。如果我不注释我的NumberGenerator
服务@Dependent
,那么在运行应用程序时,我会遇到不满意的注射点错误。但是,如果我明确注释我的NumberGenerator
实现,那么一切都会起作用。用一个单词,如果我想用@Dependent
(默认范围)注入依赖项,则必须明确指定。
public interface NumberGenerator {
String generateNumber();
}
NumberGenerator
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
@ThirteenDigits
@Dependent
public class IsbnGenerator implements NumberGenerator {
@Inject
private Logger logger;
@Override
public String generateNumber() {
String isbn = "13-84356-" + Math.abs(new Random().nextInt());
logger.log(Level.INFO, "Generated ISBN : {0}", isbn);
return isbn;
}
}
NumberGenerator
的第二个实现
import java.util.Random;
import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
@EightDigits
@Dependent
public class IssnGenerator implements NumberGenerator {
@Inject
private Logger logger;
@Override
public String generateNumber() {
String issn = "8-" + Math.abs(new Random().nextInt());
logger.info("Generated ISSN : " + issn);
return issn;
}
}
这是注射NumberGenerator
的地方
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.interceptor.Interceptors;
@Dependent
public class BookService {
@Inject
@EightDigits
private NumberGenerator numberGenerator;
public Book createBook(String title, float price, String description) {
Book book = new Book(title, price, description);
book.setNumber(numberGenerator.generateNumber());
return book;
}
}
最后,将BookService
注入此JSF托管BEAN中以创建Book
实例。
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@Dependent /* if I leave this out, then this bean will not display
the book instance properties on the JSF page, I just see
a blank screen, but when I add this @Dependent annotation
the JSF page displays the dummy content below.
*/
public class MyBean {
@Inject
private BookService bookService;
public Book getBook() {
return bookService.createBook("Dummy Title", 21.05f, "Dummy Description");
}
}
您可以看到,每次我想要DI时,我都必须使用@Dependent
进行默认范围。现在,我正在将IssnGenerator
注入@EightDigits
的CC_12中,如果我从IssnGenerator
中删除@Dependent
,我会收到此编译错误。
Unsatisfied dependencies for type NumberGenerator with qualifiers @EightDigits at injection point [BackedAnnotatedField] @Inject @EightDigits private BookService.numberGenerator
谢谢您的任何建议。
如果您不指定META-INF/beans.xml
文件,这似乎是您的情况,您会得到隐式bean Archive (请参阅CDI-1.1§12.1)。/p>
在隐式bean存档中,只有CDI引擎才能发现具有 bean定义注释的豆。
任何范围都是 bean定义注释(请参阅CDI-1.1§2.5)。这就是为什么如果您添加范围(例如@Dependent
),则您的bean会被CDI发现,并且您没有不满意的依赖性错误。
@Dependent
是默认范围的事实在这里与默认范围无关,因为如果没有任何范围,您的豆子就不会发现。
如果将bean-discovery-mode
设置的META-INF/beans.xml
文件添加到all
,则您获得了显式bean Archive ,这意味着您的存档中的所有bean都将被发现,并且默认情况下将具有@Dependent
范围。