2011-05-01 153 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。在這種情況下,它看起來像你的「客戶端」不是一個託管對象。

如果你真的想走這條路線,你可能想看看春天,這將允許你注入非管理對象。