@EJB вводить из другой банки - PullRequest
4 голосов
/ 18 ноября 2011

Я пытаюсь внедрить бин, расположенный в другом файле jar, чем бин, в который я пытаюсь внедрить его.Оба bean-компонента - это просто базовые bean-компоненты @Stateless с локальным и удаленным интерфейсами.Если я использую обычную инъекцию

@EJB
IBean injectedBean;

или

@EJB
IBeanLocal injectedBean;

, я получаю исключение NullPointerException при развертывании приложения.

Если я использую:

@EJB(mappedName="Bean")
IBean injectedBean;

или

@EJB(mappedName="Bean")
IBeanLocal injectedBean;

все работает, и JBoss не выдает ошибок развертывания.

Я мог бы упомянуть, что я использую JBoss 5.

Класс бина, который я внедряю:объявлено как:

@Remote
public interface IBean

@Local
public interface IBeanLocal extends IBean

@Stateless(name = "Bean")
public class Bean implements IBean, IBeanLocal

Моя проблема заключается в том, что, как указано в документации, свойство mappedName зависит от поставщика.Есть ли другой способ заставить это работать?

решено:

Мне удалось решить проблему.

Проблема заключалась в том, что я пытался развернуть оба jar-файла по отдельности, что означало, что каждый получит свой собственный ClassLoader в JBoss, чтобы они не могли найти друг друга и возвращали исключение NullPointerException при попытке внедрить bean-компонент.

Решением было добавить банки к уху и добавить META-INF, содержащий application.xml, похожий на это:

<application xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"
         version="1.4">

  <display-name>Simple example of application</display-name>

  <module>
    <ejb>ejb1.jar</ejb>
  </module>
  <module>
    <ejb>ejb2.jar</ejb>
  </module>
</application>

Мне также пришлось изменить некоторые JNDI-поиски, которые я сделал длясопоставьте новую структуру, добавив имя уха перед классами: «ear-name / bean»

После этого я просто добавил банки к уху, и все хорошо развернулось.

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Вам нужно объявить локальный интерфейс, чтобы JBoss находил компонент на основе только интерфейса (при условии, что вы используете EJB 3.0):

@Stateless(name = "Bean")
@Local ( IBeanLocal.class  )
@Remote ( IBean.class )
public class Bean implements IBean, IBeanLocal { ... }

Редактировать: IBean - это удаленный интерфейс (см. комментарий).

0 голосов
/ 18 ноября 2011

Попробуйте ввести в свой бин @EJB(beanName = "Bean")

Не уверен, что это сработает, но у нас была похожая проблема, и она была вызвана отсутствием атрибута beanName.

...