Могу ли я использовать инжекцию конструктора CDI для EJB? - PullRequest
15 голосов
/ 07 февраля 2012

Я хочу сделать что-то вроде этого:

@Stateless
public class GreeterEjb {


    private final Greeter greeter;


    @Inject
    public GreeterEjb(Greeter greeter) {
        this.greeter = greeter;
    }


    public String greet() {
        return greeter.greet();
    }
}

Я пробовал это на Glassfish 3.1.1 и JBoss 7.0.2 со смешанными результатами. При некоторых обстоятельствах это работает, а при других - нет. См. эту тему на форуме Glassfisch , если вас интересуют подробности.

Спецификация EJB 3.1 , раздел 4.9.2 Классы бинов:

Класс должен иметь открытый конструктор, который не принимает параметров.

Звучит так, как если бы EJB-компоненты не допускали внедрение в конструктор

НО спецификация CDI говорит в начале раздела 3, что сессионные компоненты поддерживаются CDI. Затем в разделе 3.2 подробно говорится о CDI и EJB, но никогда не упоминается ничего о том, что инжектор конструктора не работает. Что заставляет меня думать, что это должно быть разрешено.

Итак, спецификации допускают внедрение конструктора CDI для EJB или нет?

Ответы [ 2 ]

19 голосов
/ 08 февраля 2012

Крис и Пит Мьюр наконец убедили меня: EJB должен иметь открытый конструктор без аргументов, даже если для инъекции используется другой конструктор.Странно использовать два конструктора одновременно, но это работает.Спасибо, ребята.

Успешно протестировано на Glassfish 3.1.1, JBoss 7.0.2 и TomEE 1.0.0-beta-2.

@Stateless
public class GreeterEjb {

    private final Greeter greeter;


    @Inject
    public GreeterEjb(Greeter greeter) {
        this.greeter = greeter;
    }


    // public no-arg constructor required for EJBs
    // injection still works fine with the @Inject constructor
    public GreeterEjb() {
        this.greeter = null;
    }


    public String greet() {
        return greeter.greet();
    }
}
9 голосов
/ 07 февраля 2012

Внедрение EJB в конструктор требуется только в Java EE 6, ЕСЛИ CDI включен для jar.Если это не работает на сервере приложений, отправьте сообщение об ошибке.

Пожалуйста, также сообщите об этом здесь - http://java.net/jira/browse/EJB_SPEC - чтобы исправить языковую спецификацию EJB (это неправильно).

Это проверено в CDITCK - https://github.com/jboss/cdi-tck/blob/master/impl/src/main/java/org/jboss/cdi/tck/tests/implementation/enterprise/definition/ExplicitConstructorSessionBean.java - но не для представлений без интерфейса, поэтому, пожалуйста, поднимите проблему в https://issues.jboss.org/browse/CDITCK, и мы можем добавить тест для вашего случая.

...