2013-11-03 2 views
1

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

Я объясню пример, если быть более точным.

EAR Структура следующее:

EAR 
| 
— core.jar (EJB-module with core EJB) — application core 
| 
— app.jar (another EJB-module with EJBs) — business logic here 
| 
— web.war (servlets) 

В code.jar есть EJB:

@LocalBean 
@Singleton 
@Startup 
public class AppInfo(){ 
    private int counter; 

    public void incCounter(){ 
    counter++; 
    } 
    public int getCounterValue(){ 
    return counter; 
    }  
} 

В модуле app.jar мы имеем Stateless EJB, который пытается читать счетчик.

@Stateless 
public class SomeBean{ 
    @EJB private AppInfo appinfo; 

    public void run(){ 
     int counter = appInfo.getCounterValue(); // here method throws with NPE 
     System.out.println("Counter value is: "+counter); 
    } 
} 

На модуле web.war есть сервлет, что увеличение значения счетчика для каждого запроса:

public class MyServlet extends HttpServlet{ 
     @EJB private AppInfo appInfo; 
     protected void doPost(params){ 
       appInfo.incCounter(); 
       ... 
       other code 
     } 
    } 

Во время отладки, я обнаружил, что: На сервлета инъекции хорошо работать: при вводе doPost() AppInfo является объектом Proxy для AppInfo EJB. В SomeBean есть NPE: at run() значение точки входа appInfo = null.

Как правильно ввести EJB из core.jar в другой EJB из приложения?

P.S. Я развертываю EAR для JBoss 6.1 EAP P.S.S. Я также попытался с помощью @Remote: не работает (AppInfo по-прежнему равна нулю)

ответ

0

Чтобы получить доступ к EJB из другого модуля, вы должны сделать со следующими способами:

  1. Использование Remote доступа вместо Local доступа. или
  2. Использование JNDI.

Подробнее см. В этом tutorial.

+0

Ну, я говорю еще раз: я также пытался использовать @Remote: не работает (appInfo по-прежнему равен нулю) – kyberorg

0

Я думаю, что Local должен работать - это в том же приложении.

Попробуйте полное имя пакета:

@EJB(beanName="my.package.AppInfo") 
+0

Мы используем EJB 3.1, так как я полагаю, что '@ Local' больше не нужен, а также мы используем' @ LocalBean' вместо определения интерфейса '@ Local' – kyberorg

0

Это, кажется, что это JBoss порядок развертывания проблема. Когда контейнер создает новый экземпляр SomeBean и пытается вставить фасоль AppInfo, эта еще не была создана/развернута.

Попробуйте переименовать файл jars, указав правильный порядок зависимостей. (например, a_core.jar и b_app.jar).

Другой возможностью может быть инжекция одноэлементного компонента на setter method.

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