Внедрение EJB-компонента в сервлет GWT - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть проект, в котором мне нужно установить RP C связь между веб-клиентом GWT и бэкэндом JBoss 6. Я создал небольшой тестовый проект для экспериментов. Мне удалось настроить и развернуть клиент и сервер, и я могу взаимодействовать с веб-клиентом. Проблема в том, что мне не удается заставить компонент службы с сервера внедрить его в сервлет GWT с помощью аннотации @EJB. Я перепробовал все возможные варианты конфигурации, но когда сервлет получает вызов от клиента, внедренный компонент всегда имеет значение null.

Я уверен, что все настроено правильно. Я вижу

, связывающий следующие записи в глобальном JNDI:

tutorial_ear / SampleBean / local - EJB3.x локальный бизнес-интерфейс по умолчанию

tutorial_ear / SampleBean / local-com.example.tutorial.ejb.SampleBeanLocal - EJB3.x Локальный бизнес-интерфейс

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

Структура проекта:

tutorial_ear.ear -> МЕТА-ИНФ -> tutorial_ejb.jar -> tutorial_gwtapp.war

Сервлет GWT:

@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService
{
    @EJB(mappedName = "tutorial_ear/SampleBean/local")
    public SampleBeanLocal sampleBean;

    public String greetServer(String input) throws IllegalArgumentException
    {
        try
        {
            if (sampleBean == null)
            {
                Properties props = new Properties();
                props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
                props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
                props.setProperty("java.naming.provider.url", "127.0.0.1:1099");
                InitialContext ctx = new InitialContext(props);
                sampleBean = (SampleBeanLocal) ctx.lookup("tutorial_ear/SampleBean/local");
            }
            return "Say " + sampleBean.getEJBHello(input);
        }
        catch (NamingException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

Клиентский интерфейс

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService
{
    String greetServer(String name) throws IllegalArgumentException;
}

EJB Bean

@Stateless(name = "SampleBean")
@Local(SampleBeanLocal.class)
public class SampleBean implements SampleBeanLocal
{
    /**
     * Default constructor.
     */
    public SampleBean()
    {
    }

    @Override
    public String getEJBHello(String name)
    {
        return "Hello " + name + ".";
    }
}

веб. xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
         version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee">

  <!-- Servlets -->
  <servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.example.tutorial.server.GreetingServiceImpl</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/tutorial_gwtapp/greet</url-pattern>
  </servlet-mapping>

  <!-- Default page to serve -->
  <welcome-file-list>
    <welcome-file>Tutorial_gwtapp.html</welcome-file>
  </welcome-file-list>

</web-app>

заявка. xml

<?xml version="1.0" encoding="UTF-8"?>
<application 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/application_6.xsd"
      version="6">
    <display-name>TutorialGwt</display-name>

    <module>
        <web>
            <web-uri>tutorial_gwtapp.war</web-uri>
            <context-root>/tutorial_gwtapp</context-root>
        </web>
    </module>

    <module>
        <ejb>tutorial_ejb.jar</ejb>
    </module>       

    <!--@includes-->
</application>
...