EJB依赖注入Servlet - WAS7

时间:2011-09-01 14:25:26

标签: dependency-injection ejb websphere websphere-7

我正在尝试使用@EJB注释注入EJB:

  • 当我将EJB注入另一个EJB时,它工作正常。
  • 当我将相同的EJB注入到servlet中时,我得到了一个空指针异常(我的EJB为null)。

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();
    }
}

WAR中的web.xml没有什么特别的,只有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 &amp; EJB 3.0

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我的第一个镜头是,如果你为无状态EJB指定一个'name',你应该用'mappedName'属性注入它,例如。 '@EJB(mappedName =“foo.Foo Remote”)'

答案 1 :(得分:0)

你在哪个Fixpack?在FixPack 11之前,WAS7的依赖注入机制被打入了地狱。尝试升级到15(不要使用最新的,17个令人讨厌的bug,使用commons-logging)