2014-09-29 4 views
0

У меня есть проект 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> 
+0

вопрос является дубликатом http://stackoverflow.com/questions/3027834/inject-a-ejb-into-jax-rs-restfull-service –

ответ

0

Ваш EventWS помечается @Stateless, хотя в модуле WAR. Случается, что ваша аннотация @Stateless игнорируется (поскольку она находится в WAR), а ваш EventWS компонент не управляется, поэтому значения не вводятся.

Вам необходимо сделать EventWS управляемый CDI-компонент (например, @RequestScoped). Вы можете показать оставшуюся конфигурацию (web.xml и аннотации JAX-RS, которые вы пропустили) для дальнейшей помощи.

Update, чтобы ответить на вопрос в комментарии:

Вы используете нестандартное определение сервлета. Я не знаю, уважает ли джерси сервлет аннотаций CDI, поэтому вы можете попробовать это в web.xml вместо этого: (.. Или подкласс javax.ws.rs.core.Application с @ApplicationPath аннотацию См Java EE 7 Tutorial подробности)

<servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/resources/*</url-pattern> 
</servlet-mapping> 

И не делайте этого, чтобы комментировать ваш EventWS с @RequestScoped или @SessionScoped или что-то подходящее для ваших нужд.

+0

Почему @Stateless аннотация игнорируется в WAR? – Sriram

+0

Я обновил сообщение, чтобы включить аннотации JAX-RS и web.xml. Как я могу сделать EventWS компонентом CDI? Какие аннотации и файлы конфигурации xml мне нужны (beans.xml?)? – Baderous

+0

обновил мой ответ –

Смежные вопросы