GlassFish, CDI и конструктор инъекций - PullRequest
5 голосов
/ 22 августа 2010

Поддерживается ли внедрение конструктора в реализации CDI GlassFish 3.1 для управляемых bean-компонентов?У меня есть @Singleton EJB, в который я хочу внедрить другой управляемый бин (содержащийся в том же модуле EJB), используя инжектор конструктора.Полевая инъекция работает.Но с инжектором конструктора я получаю NullPointerException от 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;
    }

}

Ответы [ 2 ]

9 голосов
/ 23 августа 2010

CDI поддерживает непосредственное введение поля, введение параметра метода инициализатора и введение параметра конструктора.Из спецификации CDI 1.0:

3.7.Конструкторы бина

Когда контейнер создает экземпляр класса бина, он вызывает конструктор бина .Конструктор бина является конструктором класса бина.

Приложение может напрямую вызывать конструкторы бина.Однако, если приложение создает экземпляр компонента напрямую, контейнер не передает параметры конструктору;возвращенный объект не привязан ни к какому контексту;контейнер не вводит никаких зависимостей;и жизненный цикл нового экземпляра не управляется контейнером.

3.7.1.Объявление конструктора бина

Конструктор бина может быть идентифицирован аннотированием конструктора @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() {}

    ...
}

Если класс бина не объявляет конструктор явно, используя @Inject, конструкторкоторый не принимает никаких параметров, является конструктором компонента.

Если класс компонента содержит несколько аннотированных конструкторов @Inject, контейнер автоматически обнаруживает проблему и обрабатывает ее как ошибку определения.

Еслиу конструктора бина есть аннотированный параметр @Disposes или @Observes, контейнер автоматически обнаруживает проблему и обрабатывает ее как ошибку определения.

Конструктор бина может иметь любое количество параметров.Все параметры конструктора бина являются точками внедрения.

Интересно, может ли ваша проблема быть связана с WELD-141 , хотя.

Ссылки

  • CDI 1.0, спецификация
    • Раздел 3.7.«Конструкторы бобов»
  • Документация по сварке
3 голосов
/ 17 февраля 2013

Внедрение конструктора поддерживается в GlassFish 3.x, но вы все равно должны предоставить конструктор по умолчанию, чтобы удовлетворить спецификации EJB.

Это будет работать:

@Singleton
public class FooBean implements Foo {

    private final BarBean bar;

    public FooBean() {
      this.bar = null;
    }

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

, но Glassfish (эта часть зависит от контейнера) вызовет конструктор по умолчанию перед Injected.

...