Подтвердить что ты не робот

Могу ли я использовать инъекцию конструктора CDI для EJB?

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

@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 Bean Классы говорят:

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

Это похоже на то, что для EJB не допускается инъекция конструктора.

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

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

4b9b3361

Ответ 1

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

Успешно протестирован на 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();
    }
}

Ответ 2

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

Пожалуйста, также зарегистрируйте проблему здесь - 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, и мы можем добавить тест для вашего дела.