【问题标题】:EJB dependency injection into Servelt - WAS7EJB 依赖注入到 Servelt - WAS7
【发布时间】:2011-09-01 14:25:25
【问题描述】:

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

  • 当我将一个 EJB 注入另一个 EJB 时,它工作正常。
  • 当我将相同的 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 实现:

package com.mycompany.myapp.ejb.hello;

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

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

我的小服务程序:

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 7EJB 3.0

任何帮助将不胜感激。

【问题讨论】:

  • 我在 Glassfish 3 服务器上部署了同一个耳朵,它运行良好。
  • 控制台是否有错误提示注入失败?在 PK97815 之前,即使注入失败,WebSphere Application Server 也会将 servlet 投入使用。
  • 乍一看,您的代码看起来是正确的,但看起来依赖注入由于某种原因在 WAS 上失败了。您能否导出已安装的 EAR(Applications > Application Types > WebSphere 企业应用程序,然后选择您的应用程序并单击 Export 按钮)并查看 WAR 的 WEB-INF/web_merged.xml 的内容? WAS 应该添加适当的“ejb-local-ref”配置。

标签: dependency-injection ejb websphere websphere-7


【解决方案1】:

我的第一枪是,如果您为无状态 EJB 指定一个“名称”,您应该将其注入“mappedName”属性,例如。 '@EJB(mappedName="foo.FooRemote")'

【讨论】:

  • WebSphere Application Server 不支持 mappedName。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2011-07-14
    • 2012-08-01
    • 2018-02-25
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多