【问题标题】:Java dependency injection problemJava依赖注入问题
【发布时间】:2011-05-01 22:04:40
【问题描述】:

我正在尝试 Java 反射附带的一些 j2ee 功能。因此我尝试了没有任何问题的 JNDI 查找,但我也想尝试相反的版本“依赖注入”。但是效果不太好,我也找不到原因。

反正下面只是一个简单的函数,我只是想用它来试试DI功能。但是,当我现在编译它时,我会得到Exception in thread "main"java.lang.NullPointerException。任何人都可以看到我在哪里做错了吗?顺便说一句,我正在使用 Glassfish。于是在/<glassfish>/autodeploy folder中部署了一个jar文件

界面

import javax.ejb.*;
@Remote
public interface Hello {

    public void sayHello(Stiring name);
}

实现

import javax.ejb.*;

@Stateless(name = "FooBean", mappedName = "ejb/FooBean")
public class HelloImpl implements Hello {


    @Override
    public void sayHello(String name) {
        System.out.println("Hello " +name);
    }
}

客户

import javax.ejb.EJB;
public class ClientTest {
    @EJB
    static Hello bdb;

    public static void main(String args[]) {
        bdb.sayHello("starcorn");
    }
}

【问题讨论】:

    标签: jakarta-ee dependency-injection glassfish ejb-3.0


    【解决方案1】:

    您只能注入托管对象。例如无状态/有状态会话 bean。在这种情况下,您的“客户”看起来不是托管对象。

    如果你真的想走这条路,你可能想看看 spring,它允许你注入非托管对象。

    【讨论】:

      【解决方案2】:

      您可能错过了沿路的一些步骤,仅凭上面的片段很难说...... 看看this tutorial on the Netbeans site,它显示了完整的过程。

      【讨论】:

      • 我正在使用 eclipse,虽然设置部分看起来更乏味
      【解决方案3】:

      不确定 J2EE 特定,但从一般 Java 特性来看,您永远不会初始化 bdb (bdb = new HelloImpl())。因此,您似乎正在尝试对未初始化的变量调用非静态方法。如果您将 sayHello 设为静态,则无需对其进行初始化(甚至将其声明为成员)。

      public class HelloImpl implements Hello {
          @Override
          public static void sayHello(String name) {
          }
      }
      
      public class ClientTest {
          public static void main(String args[]) {
              HelloImpl.sayHello("starcorn");
          }
      }
      

      【讨论】:

      • 不,这是非常方便的东西:-)
      • 是的,正如 fvu 所说,我正在尝试使用注入,因此我不需要创建实例
      【解决方案4】:

      你不能直接通过 Eclipse 运行一个主类并且仍然获得依赖注入。您必须使用application client container 才能进行注入。

      【讨论】:

      • 是的,我有一个应用程序客户端容器。为此,我正在使用 glassfish。但是如何执行主要功能?因为我现在不能通过在 Eclipse 中构建项目来运行它。所以我想我必须从我的 EJB 和 Client 中创建一个 jar 文件,然后在 Glassfish 的应用程序容器中运行它,对吧?
      • 你点击链接了吗?特别是“使用嵌入式 ACC”链接? download.oracle.com/docs/cd/E18930_01/html/821-2418/…
      【解决方案5】:

      嘿,我解决了这个问题。 基本上我无法将依赖注入作为普通的 java 应用程序运行。因此,我使用 Glassfish 的 appclient 解决了这个问题。

      我需要做的是将我的客户端与我的 EJB (FooBean) 打包到一个 EAR 项目中。然后从中生成一个Jar文件。除此之外,当我创建 EAR jar 时,我还必须专门在 @EJB 将其重写为 @EJB(name="beanName", unitName="beanUnitName"),我必须指定 Main 类的位置。

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 2014-12-27
        • 2015-04-22
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多