使用 CDI + Weld 的构造函数注入

Constructor Injection with CDI + Weld

我想使用构造函数注入,因为它使我的单元测试更安全且更易于编写:我不能忘记设置要注入的字段。 CDI 支持这一点,@Inject 注释的 javadoc 说:“@Inject 对于 public 是可选的,当没有其他构造函数存在时,无参数构造函数。这使注入器能够调用默认构造函数."

我知道其他标准需要一个无参数的构造函数(例如 JAX-RS;请参阅 this question),这真令人失望。但即使对于一个简单的 class,如:

public class Bar {
    private final Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }
}

焊接失败,说:DeploymentException: WELD-001408: Unsatisfied dependencies for type Bar。当我添加 @Inject 注释时,它起作用了。

我真的不希望 Weld 中出现任何错误,因为它已经存在多年了;我可能弄错了什么。但也许它没有引起注意,只是因为 Jakarta EE 社区根本不进行任何构造函数注入。

这不是焊接错误。作为 specification indicates,您的构造函数需要 @javax.inject.Inject。唯一你不需要它的时候是当你有一个零参数构造函数并且你不希望容器调用任何其他构造函数时。