У меня есть проект Maven в Eclipse, который развертывается как EAR, содержащий модуль JAR (проект Java 1.7, EJB 3.1 и JPA 2.0) и модуль WAR (Servlet 3.0, Java 1.7, JAX -RS 1.1). Я развертываю его в Weblogic 12.1.1.0. Структура выглядит следующим образом:Инъекция EJB в компоненте веб-приложения
backoffice-ear
backoffice-ejb-core-0.0.1-SNAPSHOT.jar
backoffice-ws-0.0.1-SNAPSHOT.war
Проект WS имеет классы, которые реализуют REST веба-службы, которые вызывают услуги и доступ к данным объектам, определенные как Stateless EJB в проекте EJB. Вот пример:
WAR:
@Path("/Events")
@Stateless
public class EventsWS {
@EJB
private EventsService eventsService;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/searchEvents")
public Response searchEvents() {
eventsService.searchEvents(null, "S", "TEST", new BigDecimal(1), new BigDecimal(20));
...
}
}
JAR:
@Stateless
public class EventsService {
@EJB
private EventsDao dao;
public DtoSearchEvents searchEvents(...) throws ServiceException {
...
}
}
Инъекции прекрасно работают внутри модуля JAR. Но между WAR и JAR они этого не делают. Что здесь происходит, так это то, что введенная EJB-услуга в EventsWS
всегда равна нулю. Но если я загрузить его через JNDI, я могу использовать его правильно:
Context context = new InitialContext();
eventsService = (EventsService)context.lookup("java:global/backoffice-ear/backoffice-ejb-core-0.0.1-SNAPSHOT/EventsService");
Но я хочу, чтобы иметь возможность вводить EJB без загрузки его через JNDI. Я уже пробовал использовать атрибут @EJB's mappedName
с указанным выше контуром JDNI, но безуспешно. Я полагаю, что я использую правильный путь JNDI. Что мне не хватает? Дайте мне знать, если вам нужна дополнительная информация.
Мой web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>backoffice-ws</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>backoffice-ws-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>xxx.yyy.zzz.backoffice.ws</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>backoffice-ws-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
вопрос является дубликатом http://stackoverflow.com/questions/3027834/inject-a-ejb-into-jax-rs-restfull-service –