GlassFish,CDI和构造函数注入

Ton*_*oni 5 dependency-injection glassfish constructor-injection cdi java-ee-6

GlassFish 3.1的托管bean的CDI实现是否支持构造函数注入?我有一个@SingletonEJB,我想使用构造函数注入注入另一个托管bean(包含在同一个EJB模块中).现场注入确实有效.但随着构造器注入我收到了NullPointerExceptionAbstractSingletonContainer.

这确实有效:

@Singleton
public class FooBean implements Foo {

  @Inject private BarBean bar;

}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

@Singleton
public class FooBean implements Foo {

    private final BarBean bar;

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

}
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 9

CDI确实支持直接场注入,初始化方法参数注入和构造函数参数注入.从CDI 1.0规范:

3.7.Bean构造函数

当容器实例化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() {}

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果bean类没有使用显式声明构造@Inject函数,则不接受任何参数的构造函数是bean构造函数.

如果bean类具有多个带注释@Inject的构造函数,则容器会自动检测问题并将其视为定义错误.

如果bean构造函数具有注释参数@Disposes,或者@Observes容器会自动检测问题并将其视为定义错误.

bean构造函数可以包含任意数量的参数.bean构造函数的所有参数都是注入点.

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

参考

  • CDI 1.0规范
    • 第3.7节."Bean构造函数"
  • 焊接文档