@EJB в JBoss 5.1.0 GA? - PullRequest
       30

@EJB в JBoss 5.1.0 GA?

4 голосов
/ 20 июля 2010

Я некоторое время боролся за это.

Я пытаюсь подготовиться к 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 с по умолчанию конфигурации.(Я также пробовал с all конфигурацией)

Однако я использовал для получения нулевой ссылки на инъекцию сессионного компонента.Поработав в течение дня или около того, я наконец попробовал уродливый метод поиска JJDI EJB 2.x вместо @EJB аннотации с конфигурацией для jndi, указанной в файле jndi.properties, и она работала без каких-либо других изменений!

Теперь я попытался выяснить в документации JBoss, поддерживает ли JBoss 5.1.0 GA инъекцию с аннотацией @EJB, но не смог найти конкретный ответ.Так может кто-нибудь сказать мне, так ли это?потому что я действительно предпочел бы аннотацию поиску JNDI (я имею в виду, кто не будет?).Я что-то упустил? ..

Вероятно, следовало бы поместить это на форумах JBoss, но .. Я пристрастился к этому месту; -)

Ответы [ 2 ]

5 голосов
/ 21 июля 2010

Это определенно поддерживается JBoss 5.x, поскольку он сертифицирован Java EE 5.

На самом деле, я предлагаю проверить Глава 11. Введение в EJB-инъекцию в сервлетах из JBoss EJB3 Tutorials , они описывают подробный и пошаговый пример.

И обратите особое внимание на следующее примечание:

Чтобы инъекция происходила в веб-модуле, ваш web.xml должен использовать версию 2.5 веб-приложения.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">
1 голос
/ 11 апреля 2013

У меня была похожая проблема с использованием удаленного 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».

...