我正在尝试一些带有Java反射的j2ee功能。因此,我尝试了JNDI查找,没有任何问题,但我也想尝试相反的版本“依赖注入”。然而它没有那么好用,我也找不到原因。
无论如何它下面只是一个简单的功能,我只想用来试用DI功能。但是当我现在编译它时,我会得到Exception in thread "main"java.lang.NullPointerException
。任何人都可以看到我犯错的地方?顺便说一句,我正在使用Glassfish。所以在/<glassfish>/autodeploy folder
界面
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");
}
}
答案 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类的位置。