2011-05-01 131 views
1

我正在尝试一些Java反射带来的j2ee功能。因此我尝试了没有任何问题的JNDI查找,但我也想尝试相反版本的“依赖注入”。然而,它并没有那么好,我也找不到为什么要这么做。Java依赖注入问题

无论如何,它只是一个简单的功能,我只是想用它来试用DI功能。但是,当我编译它时,我会得到Exception in thread "main"java.lang.NullPointerException。任何人都可以看到我犯错的地方?顺便说一句,我正在使用Glassfish。因此,已经在/<glassfish>/autodeploy folder

接口

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

    public void sayHello(Stiring name); 
} 

实施

部署一个jar文件
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

嘿,我解决了问题。 基本上我无法像普通的Java应用程序那样运行依赖注入。因此我通过使用Glassfish的appclient来解决这个问题。

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

0

你可能已经错过沿路的一些步骤,很难说只有上述片段......。 H看看this tutorial on the Netbeans site,它显示了完整的程序。

+0

我使用日食虽然看似设置部分是比较繁琐的 – starcorn 2011-05-02 09:44:15

0

不确定关于J2EE的具体情况,但是从一般的Java-ness你永远不会初始化bdb(bdb = new HelloImpl())。所以看起来你试图在一个未初始化的变量上调用非静态方法。如果你说你好静态你不需要初始化它(甚至声明它是一个成员)。

public class HelloImpl implements Hello { 
    @Override 
    public static void sayHello(String name) { 
    } 
} 

public class ClientTest { 
    public static void main(String args[]) { 
     HelloImpl.sayHello("starcorn"); 
    } 
} 
+0

BDB应该得到注入,这是整点... – fvu 2011-05-01 23:06:18

+0

是EJB – JohnKlehm 2011-05-01 23:14:51

+0

罗偷偷摸摸的东西,这是很方便的东西:-) – fvu 2011-05-01 23:16:27

0

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

+0

是的我有一个应用程序客户端容器。我为此使用了glassfish。但是,如何执行主要功能?因为我现在无法通过在Eclipse中构建项目来运行它。所以我想我必须从我的EJB和客户端创建一个jar文件,然后在Glassfish的应用程序容器中运行它,对吧? – starcorn 2011-05-03 22:01:45

+0

您是否关注链接?特别是“使用嵌入式ACC”链接? http://download.oracle.com/docs/cd/E18930_01/html/821-2418/beakv.html#gipkt – 2011-05-04 05:22:21

1

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

如果你真的想走这条路线,你可能想看看春天,这将允许你注入非管理对象。