【问题标题】:EJB injection in Glassfish webappGlassfish webapp 中的 EJB 注入
【发布时间】:2010-05-18 18:49:46
【问题描述】:

我有一个应用程序正在尝试使用 @EJB 注释在我的 ejb.jar 文件中注入对 EJB 的远程引用。我得到不一致的结果。在一种情况下,我在 web.xml 中有一个侦听器,它被调用并且显然正确注入了 EJB,因为我可以看到它连接到 EJB 并在其上调用方法。在另一个类(struts2 操作)中,当它尝试访问 EJB 引用时,我得到了 NPE。据我所知,它们是相同的调用,位于同一个 .war 文件中的 Java 类中。

作为一种变通方法,我在构造函数中添加了代码以通过全局 JNDI 名称查找 EJB,它工作正常。我只是想不通为什么一个@EJB 有效,而另一个无效。

【问题讨论】:

    标签: jakarta-ee struts2 cdi ejb-3.1 glassfish-3


    【解决方案1】:

    如何在 Struts 2 动作中注入 EJB?你在用 CDI 吗?你在用Struts2 CDI plugin吗?

    更新:问题是容器没有创建 Struts 对象,Struts 是,所以容器没有机会注入任何东西。您必须使用提到的plugin for CDI 在您的操作中启用注入。

    如果您想尝试一下,请获取 Struts 2 源代码:

    svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2
    

    然后cd进入struts2目录并运行以下命令(这将编译struts-cdi-plugin所需的模块)

    mvn install -pl plugins -am
    

    然后获取cdi-plugin的源码:

    svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/
    

    并编译它:

    mvn install
    

    现在,我的 pom.xml 中有以下依赖项:

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.2.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-cdi-plugin</artifactId>
        <version>2.2.0-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>javassist</groupId>
      <artifactId>javassist</artifactId>
      <version>3.8.0.GA</version>
    </dependency>
    

    我能够在 Action 中注入 EJB:

    public class HelloWorld extends ActionSupport {
    
        @Inject
        HelloEJB helloEjb;
    
        @Override
        public String execute() throws Exception {
            setMessage(helloEjb.getMessage());
            return SUCCESS;
        }
    
        private String message;
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    
    }
    

    有关示例,请参阅 https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-example/

    【讨论】:

    • 不,只是一个直接的@EJB 注释。
    • 感谢您的解释。这巧妙地解释了为什么我的侦听器(由 web.xml 条目中的容器实例化)工作但我的操作(由 struts 实例化)没有。我只是假设任何带注释的类都会通过某种类加载器巫术来处理。这种事情在任何地方都有记录吗?
    • @g051051 侦听器是所谓的“托管”组件,并且注入工作(从 Java EE 5 开始,请参见 java.sun.com/developer/technicalArticles/J2EE/intro_ee5/… 例如)。 Java EE 6 超越了这个限制,使任何使用 CDI 的 POJO 中的注入成为可能(但您必须使用 CDI 或 CDI“感知”框架)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多