Java依赖注入问题

时间:2011-05-01 22:04:40

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

我正在尝试一些带有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");
    }
}

5 个答案:

答案 0 :(得分:1)

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

如果你真的想走这条路,你可能想看看spring,它会让你注入非管理对象。

答案 1 :(得分:0)

你可能错过了路上的一些步骤,很难说只是上面的碎片.... 看一下this tutorial on the Netbeans site,它会显示完整的程序。

答案 2 :(得分:0)

不确定J2EE是否具体,但是从一般的Java-ness开始,你永远不会初始化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");
    }
}

答案 3 :(得分:0)

您无法直接通过Eclipse运行主类,仍然可以获得依赖注入。您必须使用application client container才能进行注射。

答案 4 :(得分:0)

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

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