Новое в EJB world исключение нулевого указателя в клиенте EJB

Я изучаю EJB и пытаюсь выполнить пример Helloworld, приведенный в книге EJB In Action.

Мой сервер приложений - JBoss, я создал файл Jar для класса bean-компонента и интерфейса в правильном каталоге (я вижу EJB в консоли JMX).

Теперь я создал простой клиент с использованием аннотаций EJB, но получаю исключение NullPointerException.

Вот мой клиентский код.

Код клиента:

package com.client;
import javax.ejb.EJB;
import com.EJB.*;

public class HelloWorldClient {
 @EJB
 private static HelloWorldInterface HelloBean;

 public static void main(String[] args)
 {
  HelloBean.SayHelloWorldInEJB();
 }
}

Класс фасоли

package com.EJB;

import javax.ejb.Stateless;

@Stateless
public class HelloWorldBean implements HelloWorldInterface {

 public void SayHelloWorldInEJB() {
  // TODO Auto-generated method stub
  System.out.println("Hello world from the world of EJB");

 }
}

Интерфейс

package com.EJB;
import javax.ejb.Local;;

@Local
public interface HelloWorldInterface {
 public void SayHelloWorldInEJB();
}

Примечание. Я попытался указать интерфейс как удаленный, но это все равно не сработало.

Шаги, которые я сделал до сих пор, чтобы добраться до этой точки. 1) Создал файл EJB files 2) Сделал build.xml и развернул EJB.

Мне не хватает каких-либо файлов конфигурации ???


person Maximus    schedule 12.11.2010    source источник
comment
Не могли бы вы добавить трассировку стека, это поможет другим понять и диагностировать проблему.   -  person Kevin D    schedule 12.11.2010


Ответы (2)


Теперь я создал простой клиент с использованием аннотаций EJB, но получаю исключение NullPointerException.

Код вашего клиента выглядит как клиент приложения и такой клиент должен быть развернут на сервере приложений, а затем выполнен в контейнере клиента приложения (ACC), чтобы можно было выполнить внедрение. Для запуска ACC требуется специальная команда сервера приложений.

Следующая вики объясняет использование ACC в JBoss (как упаковать, развернуть и запустить ACC): Как использовать клиентское приложение в JBoss-5.

Если вы не хотите использовать контейнер клиента приложения и вместо этого просто запускаете класс клиента приложения с помощью команды java, внедрение будет невозможно, и вам придется выполнить поиск JNDI.

И в обоих случаях вам придется предоставить и использовать удаленный бизнес-интерфейс для вашего bean-компонента.

Ресурсы

Связанные вопросы

person Pascal Thivent    schedule 13.11.2010
comment
Это неверный ответ. Клиент приложения не развернут на сервере приложений. Я вижу, как слово «контейнер» заставляет людей думать, что это так, но это не так. См. Схему и описание по этой ссылке и первой абзац здесь. - person DavidS; 16.07.2015
comment
Теперь я понимаю, что ошибаюсь: я обнаружил, что клиент приложения развернут на сервере приложений. Но для меня это не имеет никакого смысла. Первая ссылка, которой я поделился, утверждает, что клиент приложения работает на клиентском компьютере, но как мы можем сделать так, чтобы клиент приложения работал на клиентском компьютере и также был развернут на сервере приложений ?! (Я не могу снять свой голос против, пока ответ не будет отредактирован.) - person DavidS; 16.07.2015
comment
p.s. Я понял, что ошибался, когда проверил консоль администратора Glassfish и увидел, что мой клиент приложения действительно был развернут на сервере. - person DavidS; 16.07.2015

Вам нужно будет внести два изменения:

Замените внедрение зависимостей @EJB поиском JNDI. Внедрение зависимостей не поддерживается для POJO в EJB 3 (хотя не знаю о EJB 3.1)

Тогда интерфейс должен быть удаленным. Причина в том, что клиент здесь представляет собой отдельную Java-программу - она ​​будет работать в JVM, отличной от JVM веб-приложения.

Как внедрение зависимости через @EJB, так и интерфейс как @Local должны работать, если клиент был сервлетом на том же сервере.

person stratwine    schedule 13.11.2010
comment
На самом деле, похоже, что OP использует клиент приложения, то есть код, который должен запускаться в контейнере клиента приложения (ACC), и это делает возможным внедрение частного статического EJB в клиент. - person Pascal Thivent; 13.11.2010