2012-02-07 2 views
13

Я хочу сделать что-то вроде этого:Могу ли я использовать инъекцию конструктора 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 со смешанными результатами. При некоторых обстоятельствах это работает, при других обстоятельствах это не так. См. this thread in the Glassfisch forum, если вас интересуют детали.

EJB 3.1 spec В, раздел 4.9.2 Бобовые Классы говорит:

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

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

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

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

+0

Whey Вы хотите это сделать? Почему не нормальная инъекция? – Santosh

+1

Вы пробовали добавить конструктор no-args, а также – Kris

+0

@Kris Да. С дополнительным конструктором no-args он работает. Который я нахожу очень странным. –

ответ

16

Kris и Pete Muir окончательно убедили меня: 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(); 
    } 
} 
+1

Небольшой отзыв может заключаться в том, чтобы конструктор no-arg выбрал IllegalStateException, поскольку он не предназначен для фактического использования. Я думаю, что TomEE позволяет исключить конструктор no-arg, если у вас есть конструктор @Inject. Если это не так, то скоро будет :) –

+0

Для TomEE, который был бы «коротким» ;-) И разве он не сломал бы текущую спецификацию EJB, чтобы не требовать конструктора no-arg? –

+7

Да, я также подумал о том, чтобы выбросить исключение в конструкторе. Оказывается, что конструктор действительно вызван, и исключение исключения исключает создание экземпляра EJB. –

8

В 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, и мы можем добавить тест для вашего дела.

+0

Большое спасибо. Это именно тот ответ, который я искал :-) Последующий вопрос: почему конструктор no-arg в ExplicitConstructorSessionBean? Если я добавлю конструктор no-arg в мой EJB без интерфейса, тогда будет выполняться инъекция конструктора. Является конструктором no-arg каким-то образом, даже если используется конструктор @Inject? –

+1

Конструктор no-arg является требованием спецификации EJB. Эти две спецификации не так тесно связаны, как они могут быть. –

+1

ОК, тогда мне просто не хватает конструктора no-arg, и это не ошибка. Благодарю. Отправил это как ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^