У меня есть проект, в котором мне нужно установить 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>