【问题标题】:Using Producer methods (CDI 2.0) in Java SE在 Java SE 中使用生产者方法 (CDI 2.0)
【发布时间】:2018-08-18 07:09:31
【问题描述】:

我正在尝试编写一个在 Java SE 和 CDI 2.0 中使用生产者方法的简单示例,但遇到了Unsatisfied dependencies 问题。

这里是制作人:

private Random ran = new Random();

@Produces
private List<Integer> get() {
    return new ArrayList<Integer>() {{
        add(ran.nextInt(100));
        add(ran.nextInt(100));
    }};
}

这里是注入点:

public class RandomNumberService {

    @Inject
    private List<Integer> randomNumber;

    public void print(){
        System.out.println(randomNumber);
    }

}

我通过这样的引导运行示例:

public static void main(String... args) {
    SeContainer container = SeContainerInitializer
                    .newInstance()
                    .initialize();
    container.select(RandomNumberService.class).get().print();
    container.close();
}

我有一个 beans.xml 文件。

例外是:

线程“main”中的异常 org.jboss.weld.exceptions.DeploymentException: WELD-001408: 带有限定符的列表类型的依赖项不满足 @Default 在注入点 [BackedAnnotatedField] @Inject private com.XXXX.randomNumber at com.XXXX .RandomNumberService.randomNumber(RandomNumberService.java:0)

我已经尝试使用@Inject 来注入 bean,这没有问题,所以我知道基本设置没问题。另外,我尝试使用具体类型 ArrayList 而不是 List 和相同的结果。

任何帮助将不胜感激。

响应我尝试过的答案。

我试过了:@Inject @Any private Instance> randomNumber;

发生同样的错误。我也尝试过使用原始类型和包装器,我得到了相同的响应。

生成 POJO 时的结果相同。

@Produces
@Ford
public Car makeCar(){
    return new Car();
}

@Inject @Ford
private Car car;

我开始怀疑问题出在 SeContainer 的配置上。

【问题讨论】:

  • 在新的 maven 项目中使用您的代码的精确副本,weld-se-core 3.0.2-Final 作为依赖项和资源/META-INF 中的空 beans.xml,代码可以工作非常适合我。因此,一定有其他问题,可能与项目设置有关。哪些是您的确切依赖项,您有 beans.xml 吗?它包含什么?
  • 我想生产者的 bean没有被发现。我不确定您的beans.xml 是什么样的以及它声明的(如果有的话)bean 发现模式,但默认一个已注释。在这种情况下,只会发现带有 bean 定义注释的类。尝试在定义生产者的类上添加一些范围(例如@ApplicationScoped)。

标签: java cdi


【解决方案1】:

尝试以下方法:

@Any
@Inject
private Instance<Integer> randomNumber;

一旦Instance 实现Iterable,您将能够迭代这些值。

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 2015-10-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2023-03-29
    • 2015-04-08
    相关资源
    最近更新 更多