GlassFish、CDI 和构造函数注入

2023-11-22

GlassFish 3.1 的托管 bean 的 CDI 实现是否支持构造函数注入?我有一个@Singleton我想使用构造函数注入向其中注入另一个托管 bean(包含在同一 EJB 模块中)的 EJB。现场注入确实有效。但是通过构造函数注入我得到了NullPointerException from AbstractSingletonContainer.

这确实有效:

@Singleton
public class FooBean implements Foo {

  @Inject private BarBean bar;

}

这不起作用:

@Singleton
public class FooBean implements Foo {

    private final BarBean bar;

    @Inject
    public FooBean(BarBean bar) {
        this.bar = bar;
    }

}

CDI 支持直接字段注入、初始化方法参数注入和构造函数参数注入。来自CDI 1.0规范:

3.7. Bean 构造函数

当容器实例化一个bean时 类,它调用豆 构造函数。 bean 构造函数是 bean 类的构造函数。

应用程序可以调用bean 直接构造函数。然而,如果 应用程序直接实例化 bean,没有参数传递给 由容器构造函数;这 返回的对象未绑定到任何 语境;没有注入任何依赖项 通过容器;和生命周期 新实例不受管理 容器。

3.7.1.声明一个 bean 构造函数

bean构造函数可以被识别 通过注释构造函数@Inject.

@SessionScoped
public class ShoppingCart implements Serializable {
    private User customer;

    @Inject
    public ShoppingCart(User customer) {
        this.customer = customer;
    }

    public ShoppingCart(ShoppingCart original) {
        this.customer = original.customer;
    }

    ShoppingCart() {}

    ...
}

@ConversationScoped
public class Order {
    private Product product;
    private User customer;

    @Inject
    public Order(@Selected Product product, User customer) {
        this.product = product;
        this.customer = customer;
    }

    public Order(Order original) {
        this.product = original.product;
        this.customer = original.customer;
    }

    Order() {}

    ...
}

如果 Bean 类没有显式地 使用声明构造函数@Inject, 不接受 no 的构造函数 参数是bean构造函数。

如果一个 Bean 类有多个 构造函数注释@Inject, 这 容器自动检测 问题并将其视为定义 错误。

如果 bean 构造函数有参数 带注释的@Disposes, or @Observes, 容器自动检测 问题并将其视为 定义错误。

一个bean构造函数可以有任意数量 参数。 a的所有参数 bean 构造函数是注入点。

我想知道你的问题是否与WELD-141 though.

参考

  • CDI 1.0 specification
    • 第 3.7 节。 “Bean 构造器”
  • Weld Documentation
    • 4.1.注射点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GlassFish、CDI 和构造函数注入 的相关文章

随机推荐