gpt4 book ai didi

dependency-injection - CDI 不适用于隐式 @Dependent 作用域,不满足注入(inject)点编译时错误

转载 作者:行者123 更新时间:2023-12-01 20:04:44 25 4
gpt4 key购买 nike

容器是Glassfish 4.1

我现在在 CDI 方面遇到了一个非常奇怪的问题。如果我不注释我的 NumberGenerator 服务 @Dependent,那么当我运行应用程序时,我会不断收到不满意的注入(inject)点错误。但是,如果我显式注释我的 NumberGenerator 实现,那么一切都会正常。简而言之,如果我想要使用默认作用域 @Dependent 进行依赖注入(inject),我必须明确指定它。

 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 将被注入(inject)的地方

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 被注入(inject)到这个 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 作为默认范围。现在,我将带有限定符 @EightDigitsIssnGenerator 注入(inject)到 BookService 类中,如果我删除 @Dependent 来自 IssnGenerator,我收到此编译错误。

 Unsatisfied dependencies for type NumberGenerator with qualifiers @EightDigits at injection point [BackedAnnotatedField] @Inject @EightDigits private BookService.numberGenerator

感谢您的任何建议。

最佳答案

如果您没有指定 META-INF/beans.xml 文件(这似乎是您的情况),您将获得一个隐式 bean 存档 ( see CDI-1.1 §12.1 ) .

隐式 bean 归档中,只有具有bean 定义注释的 bean 才会被 CDI 引擎发现。

任何范围都是一个定义注释的 bean ( see CDI-1.1 §2.5 )。这就是为什么如果您添加一个范围(例如 @Dependent),您的 bean 就会被 CDI 发现,并且不会出现不满足的依赖错误。

@Dependent 是默认作用域的事实在这里并不相关,因为如果没有任何作用域,您的 bean 根本就不会被发现。

如果您添加一个 META-INF/beans.xml 文件,并将 bean-discovery-mode 设置为 all,那么您将得到显式 bean 存档,这意味着存档中的所有 bean 都会被发现,并且默认情况下将具有 @Dependent 范围。

关于dependency-injection - CDI 不适用于隐式 @Dependent 作用域,不满足注入(inject)点编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com