【问题标题】:Constructor Injection with CDI + Weld使用 CDI + Weld 进行构造函数注入
【发布时间】:2020-01-27 12:21:32
【问题描述】:

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

我了解其他标准需要无参数构造函数(例如 JAX-RS;请参阅 this question),这很糟糕。但即使对于像这样的简单类:

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 社区根本不做任何构造函数注入。

【问题讨论】:

  • 不确定到底是什么问题?正如规范所说,您不需要添加@Inject 注释如果有一个公共的、无参数的构造函数(隐式或显式)没有其他构造函数存在 .您有一个单参数构造函数,因此您需要将 @Inject 注释添加到该构造函数。如果您还需要一个无参数构造函数,您也可以添加它,但您可能不得不放弃将 foo 设为 final。
  • @Slaw 我创建了一个简约的演示项目on GitHubBoundary 注入 Bar 注入 Foo。与Bar 的第 8 行中的@Inject 一起工作正常。当我删除该注释时,Weld 抱怨:“org.jboss.weld.exceptions.DeploymentException: WELD-001408: 在注入点 [UnbackedAnnotatedField] @Inject demo.Boundary.bar 带有限定符 @Default 的 Bar 类型的依赖关系不满足”。跨度>
  • 只是为了澄清,因为您已经接受了一个答案:您本身没有无参数构造函数,这意味着您引用的规范中记录了 @Inject 注释.
  • 完全正确...我已经过度阅读了,因为它太违反直觉了。我认为只有在有多个构造函数来消除歧义时才需要它。谢谢!
  • 只有默认构造函数 => 没有构造函数注入。多个构造函数 => 使用 @Inject 标记要使用的构造函数。我们同意这一点。但是当我只有一个(非默认)构造函数时,我认为 CDI 可以接受:在我看来,其他任何东西都没有任何意义。我认为这里的标准太保守了。但我明白了道理。谢谢!

标签: java dependency-injection cdi weld constructor-injection


【解决方案1】:

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

【讨论】:

  • 你是对的。它令人困惑和限制,但这就是它的指定方式。
猜你喜欢
  • 2021-02-13
  • 2014-02-23
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多