2010-05-18 7 views
3

У меня есть приложение, которое пытается использовать аннотацию @EJB для ввода удаленных ссылок на EJB в моем файле ejb.jar. Я получаю несогласованные результаты. В одном случае у меня есть слушатель в web.xml, который вызывается и, по-видимому, правильно загружен EJB, так как я вижу, что он подключается к EJB и вызывает методы на нем. В другом классе (действие struts2) я получаю NPE, когда он пытается получить доступ к ссылке EJB. Насколько я могу судить, они одинаковые вызовы, в Java-классах, которые живут в том же файле .war.EJB injection в Glassfish webapp

Как работа, я добавил код в конструкторе для поиска EJB по их глобальным именам JNDI, и он отлично работает. Я просто не могу понять, почему один @ EJB работает, а не другой.

ответ

3

Как вы вставляете EJB в Struts 2? Вы используете CDI? Вы используете Struts2 CDI plugin?

Обновление: Проблема заключается в том, что контейнер не создает объекты Struts, Struts - это значит, что контейнер не получает возможность вводить что-либо. Вам нужно будет использовать упомянутый plugin for CDI, чтобы включить вложение ваших действий.

Если вы хотите, чтобы дать ему попробовать, получить Struts 2 источников:

svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2 

Затем cd в каталог struts2 и выполните следующую команду (это будет скомпилировать необходимые модули для struts-cdi-plugin)

mvn install -pl plugins -am 

Затем получить источники КДИ-плагин:

svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/ 

И скомпилировать:

mvn install 

Теперь, со следующими зависимостями в моем pom.xml:

<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-core</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-cdi-plugin</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>3.8.0.GA</version> 
</dependency> 

Я был в состоянии получить EJB впрыскивается в действии:

public class HelloWorld extends ActionSupport { 

    @Inject 
    HelloEJB helloEjb; 

    @Override 
    public String execute() throws Exception { 
     setMessage(helloEjb.getMessage()); 
     return SUCCESS; 
    } 

    private String message; 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 

} 

См. Пример https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-example/.

+0

Нет, просто прямая аннотация @EJB. – g051051

+0

Спасибо за объяснение. Это обстоятельно объясняет, почему мой слушатель (созданный контейнером из записи web.xml) работал, но мои действия (созданные экземплярами) не выполнялись. Я просто предположил, что любой аннотированный класс будет обработан каким-то классом-вуду. Это что-то задокументировано? – g051051

+0

@ g051051 Слушатель - это так называемый «управляемый» компонент и инъекции (с Java EE 5, см. Http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/#injection, например). Java EE 6 выходит за рамки этого ограничения, делая инъекцию возможной в любом POJO с использованием CDI (но вы должны использовать CDI или CDI «осведомленные» рамки). –

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