2011-09-01 92 views
0

我試圖注入與@EJB批註的EJB:當我注入一個EJB到正常工作的另一個EJBEJB的依賴注入的servelt - WAS7

  • 當我注入相同的EJB到一個servlet我得到一個空指針異常(我的EJB爲空)。

myapp.ear包含以下內容:

  • myapp.war(其中的servlet位於)
  • myapp.jar(其中EJB是)

EJB接口:

package com.mycompany.myapp.ejb.hello; 

@Local 
public interface HelloEjb { 
    public final static String NAME = "HelloEjb"; 
    public String sayHello(); 
} 

EJB默認地將Impl:

package com.mycompany.myapp.ejb.hello; 

@Stateless(name = HelloEjb.NAME) 
public class HelloEjbImpl implements HelloEjb { 

    @Override 
    public String sayHello() { 
     return "Hello"; 
    } 
} 

我的servlet:

public class HelloServlet extends HttpServlet { 

    @EJB 
    private HelloEjb helloEjb; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     resp.setContentType("text/html"); 
     PrintWriter out = resp.getWriter(); 
     out.println("<html>"); 
     out.println("This is my stateless session-EJB: " + helloEjb.sayHello()); 
     out.println("</html>"); 
     out.close(); 
    } 
} 

在戰爭中的web.xml無關spetacular,只有該servlet確定指標,EJB沒有標籤:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="MyApp" 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"> 

    <!-- General --> 
    <display-name>My App</display-name> 

    <!-- Standard Action Servlet Configuration --> 
    <servlet> 
     <servlet-name>helloServlet</servlet-name> 
     <servlet-class>com.mycompany.myapp.web.servlet.HelloServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Standard Action Servlet Mapping --> 
    <servlet-mapping> 
     <servlet-name>helloServlet</servlet-name> 
     <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

    <!-- The Usual Welcome File List --> 
    <welcome-file-list> 
     <welcome-file>/index.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

如果在servlet中使用查找,它可以工作我能夠獲得EJB:

helloEjb = ctx.lookup("ejblocal:com.mycompany.myapp.ejb.hello.HelloEjb"); 

我使用的Websphere 7 & EJB 3.0

任何幫助將非常感激。

+0

我在Glassfish 3服務器上部署了相同的耳朵,它工作得很好。 – chrisnfoneur

+1

控制檯中是否有錯誤表明注射失敗?在PK97815之前,即使注入失敗,WebSphere Application Server也會將servlet放入服務中。 –

+0

乍一看,您的代碼顯示正確,但由於某種原因,它看起來像依賴注入在WAS上失敗。您能否導出已安裝的EAR(_應用程序>應用程序類型> WebSphere企業應用程序_,然後選擇您的應用程序並單擊_Export_按鈕)並查看WAR的「WEB-INF/web_merged.xml」的內容? WAS應該添加適當的「ejb-local-ref」配置。 – shelley

回答

0

我的第一步是,如果你爲你的無狀態EJB指定了一個'名字',你應該給它注入'mappedName'屬性,例如。 '@EJB(mappedName =「foo.FooRemote」)'

+0

感謝Kris,我已經試過了,但它沒有奏效 – chrisnfoneur

+3

WebSphere Application Server不支持mappedName。 –

+1

爲什麼這被標記爲答案? – JCM

0

哪個Fixpack是你的?在FixPack 11之前,WAS7的依賴注入機制被擊斃了。嘗試升級到15(不要使用最新的,17,討厭的bug與commons-logging一起工作)