@EJB в JBoss 5.1.0 GA?
-
17-09-2020 - |
Вопрос
Я уже некоторое время борюсь за это.
Я пытаюсь подготовиться к EJB 3.0.Я использую JBoss 5.1.0 GA в качестве сервера приложений.Я начал с очень простого сеансового компонента без сохранения состояния с локальным интерфейсом и простого клиента jsp-сервлета, который вызывает метод сеансового компонента.Все это время я пытался использовать @EJB
аннотация для внедрения сеансового компонента в класс сервлета.
public class SampleServlet extends HttpServlet {
@EJB
private PersonLocal person;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("In servlet");
response.getWriter().write("Person Name : "+person.getName());
System.out.println(person.getName());
}
}
Я использую JBoss 5.1.0 GA с по умолчанию конфигурация.(Я также пробовал с все конфигурация)
Однако раньше я получал нулевую ссылку на внедрение сеансового компонента.После примерно дня борьбы я наконец попробовал уродливый метод поиска JNDI EJB 2.x вместо @EJB
аннотация с конфигурацией для jndi, указанной в jndi.properties
файл, и все заработало без каких-либо других изменений!
Теперь я попытался выяснить в документации JBoss, поддерживает ли JBoss 5.1.0 GA инъекцию с помощью @EJB
аннотацию, но конкретного ответа не нашел.Так может кто-нибудь сказать мне, так ли это?потому что я бы действительно предпочел аннотацию поиску JNDI (я имею в виду, кто не будет?).Я что-то пропустил..?
Наверное, стоило разместить это на форуме JBoss, но...Я зависим от этого места ;-)
Решение
Это определенно поддерживается JBoss 5.x, поскольку он сертифицирован Java EE 5.
Вообще предлагаю проверить Глава 11.Введение в внедрение EJB в сервлеты принадлежащий Учебные пособия по JBoss EJB3, там описан подробный и пошаговый пример.
И обратите особое внимание на следующее примечание:
Чтобы инъекция была проведена в веб-модуле, ваш web.xml должен использовать 2,5 версию веб-app xsd:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
Другие советы
У меня была аналогичная проблема при использовании удаленного EJB, но она была связана не с версией веб-приложения, а с тем, как мой клиент искал EJB.
Вот что сработало для меня:
//bean
@Stateless(name="xxxxService")
@Remote(xxxxRemote.class)
public class xxxxService implements xxxxRemote {
//interface - note that no annnotation is required
public interface xxxxRemote {
//in the client
@EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName='
private xxxxRemote xxxx;
В моем проекте (созданном с помощью Maven) клиент находится в веб-приложении, а EJB находится в проекте EJB, который затем обертывается в проект EAR.Сопоставление JNDI происходит в файле jboss.xml, который находится в проекте EJB (в моем проекте src/main/resources/META-INF) и выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema"
xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
version="5.0">
<enterprise-beans>
<session>
<ejb-name>xxxxService</ejb-name>
<jndi-name>myJndiNameForxxxx</jndi-name>
</session>
</enterprise-beans>
</jboss>
Это все, что потребовалось, и теперь я могу получить доступ к EJB из клиента.Надеюсь, это кому-то поможет.
Если у вас по-прежнему возникают проблемы, вы можете просмотреть консоль JMX и убедиться, что запись JNDI отображается.Посмотрите под 'jboss'>'service=JNDIview'>'list' и нажмите кнопку 'invoke'.Если ваша служба развернута правильно, вы должны увидеть имя JNDI (в моем примере myJndiNameForxxxx) в разделе «ProxyFactory».