EJB-инъекция в веб-приложении Glassfish - PullRequest
3 голосов
/ 18 мая 2010

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

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

1 Ответ

3 голосов
/ 18 мая 2010

Как вы вводите EJB в действиях Struts 2?Вы используете CDI?Используете ли вы плагин Struts2 CDI ?

Обновление: Проблема заключается в том, что контейнер не создает объекты Struts, а Struts - нетполучить возможность вводить что угодно.Вам нужно будет использовать упомянутый плагин для 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

Затем получите исходные коды модуля cdi:

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/ для примера.

...