Я пытаюсь внедрить бин, расположенный в другом файле 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»
После этого я просто добавил банки к уху, и все хорошо развернулось.