Вопрос

Я уже некоторое время борюсь за это.

Я пытаюсь подготовиться к 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».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top