EJB3 имеет значение null и запускает NullPointerExeption при использовании его в среде j2se - PullRequest
2 голосов
/ 30 января 2010

У меня NullPointerException с использованием EJB3 в среде J2SE (без контейнера EJB3)

Вкратце, у меня есть компонент без сохранения состояния, реализующий интерфейс. Когда я вызываю его в другом классе, как в основном, запускается NullPointerException.

Пример:

@stateless
@Local(IMyInterface.class)
public class myBean implements IMyInterface{...}

public class Main{
   @EJB
   IMyInterface myInterface;

   public static void main(String[] args){
      Result result = myInterface.myBeanMethod(); // Exception happens here
   }
}

Полагаю, мне не хватает некоторых вещей для инициализации, потому что EJB равен нулю, когда я впервые пытаюсь его использовать ...

Спасибо за вашу помощь,

Ответы [ 2 ]

3 голосов
/ 30 января 2010

EJB не могут работать без контейнера. Зависимости (@EJB) внедряются, если компоненты создаются контейнером. Если вы являетесь их экземплярами, то вы обязаны установить зависимости.

Кроме того, вы пытаетесь использовать нестатическую переменную из статического метода - это даже не скомпилируется.

0 голосов
/ 30 января 2010

Хотя вы можете использовать JPA (который является частью EJB 3) "Entity Beans" (фактически, POJO) в среде J2SE, вы не можете использовать Session Beans без контейнер, и вы не можете получить выгоду от внедрения ресурсов с помощью @Resource или более специализированных аннотаций @EJB и @WebServiceRef в неуправляемой среде, т.е. в контейнере. Другими словами, только управляемые компоненты поддерживают внедрение (сервлеты, управляемые компоненты JSF, компоненты EJB и т. Д.).

Итак, в вашем случае вам необходимо:

  1. Развертывание Session Bean в контейнере Java EE (например, JBoss, GlassFish, WebLogic и т. Д.)

  2. Поиск удаленного EJB с использованием его глобального имени JNDI. Код будет выглядеть так:

    Foo foo = (Foo) new InitialContext().lookup("FooEJB");
    

Несколько дополнительных замечаний:

  • В EJB 3.0 глобальное имя JNDI зависит от контейнера, поэтому я не могу точно сказать, каким оно будет (EJB 3.1, наконец, представил " portable global JNDI names ").
  • Вам потребуется настроить среду JNDI (которая зависит от контейнера) для поиска, либо указав jndi.properties на пути к классам, либо с помощью конструктора InitialContext(Hashtable).
  • Вам нужно будет предоставить серверу приложений "клиентскую библиотеку" на пути к классам клиента (который, очевидно, специфичен для каждого продукта).

Поиск предыдущих вопросов или открытие нового, если вам нужно более конкретное руководство.

...