2010-01-18 62 views
8

我一直有問題試圖從Java應用程序客戶端調用EJB的方法。 這是代碼。Glassfish v3/JNDI入門無法找到問題!

EJB遠程接口

package com.test; 

import javax.ejb.Remote; 

@Remote 
public interface HelloBeanRemote { 

    public String sayHello(); 

} 

EJB

package com.test; 

import javax.ejb.Stateless; 

@Stateless (name="HelloBeanExample" , mappedName="ejb/HelloBean") 
public class HelloBean implements HelloBeanRemote { 

    @Override 
    public String sayHello(){ 

     return "hola"; 

    } 

} 

主類(另一個項目)

import com.test.HelloBeanRemote; 
import javax.naming.Context; 
import javax.naming.InitialContext; 

public class Main { 


    public void runTest()throws Exception{ 

     Context ctx = new InitialContext(); 
     HelloBeanRemote bean = (HelloBeanRemote)ctx.lookup("java:global/Test/HelloBeanExample!com.test.HelloBeanRemote"); 
     System.out.println(bean.sayHello()); 

    } 


    public static void main(String[] args)throws Exception { 

     Main main = new Main(); 
     main.runTest(); 

    } 

} 

那麼,什麼是我的問題嗎?無法找到此EJB的JNDI條目!

java.lang.NullPointerException 
     at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at testdesktop.Main.runTest(Main.java:22) 
     at testdesktop.Main.main(Main.java:31) Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/Test/HelloBeanExample!com.test.HelloBeanRemote' in SerialContext [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException]] 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at testdesktop.Main.runTest(Main.java:22) 
     at testdesktop.Main.main(Main.java:31) Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException] 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276) 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) 
     ... 3 more Caused by: java.lang.NullPointerException 
     at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) 
     ... 4 more Java Result: 1 

我用不同的JNDI條目努力,但沒有工作(我得到這個從NetBeans中的條目控制檯):

信息:對於EJB HelloBeanExample移植的JNDI名稱:【JAVA:全球/測試/ HelloBeanExample, Java的:全球/測試/ HelloBeanExample com.test.HelloBeanRemote]

信息

:對於EJB HelloBeanExample Glassfish的特異性(非便攜式)的JNDI名稱:EJB /爲helloBean,EJB /爲helloBean#com.test.HelloBeanRemote]

所以我嘗試了以下entri ES,但我得到了同樣的異常:

  1. 的java:全球/測試/ HelloBeanExample
  2. 的java:全球/測試/ HelloBeanExample com.test.HelloBeanRemote
  3. EJB /爲helloBean
  4. EJB /爲helloBean# com.test.HelloBeanRemote

我使用Netbeans 6.8和Glassfish v3!

回答

17

其實,你的問題是你的bean的JNDI參考的查找或你會得到類似的東西:

Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found 

不,在這裏,我懷疑一個簡單的類路徑的問題,你只需在客戶端項目的類路徑中丟失一些jar。使用GlassFish v3,添加$GF_HOME/modules/gf-client.jar應該足夠像GlassFish的EJB常見問題中的How do I access a Remote EJB component from a stand-alone java client?中提到的(我的理解是這個jar應該取代$GF_HOME/lib/appserv-rt.jar,這是出於兼容原因與GFv2)。然而,從GlassFish安裝目錄中引用gf-client.jar或者清單中聲明的​​jar無法找到是非常重要的。

gf-client.jar是指許多其他.jar文件從GlassFish安裝目錄,所以最好從安裝目錄本身,而不是複製它(和所有其他.jar文件)到另一個位置內引用它。

一旦解決了這個問題,您應該能夠使用GlassFish在日誌中輸出的JNDI名稱來查找bean。我建議使用Java EE 6中新的可移植全局JNDI名稱。

以防萬一,從GlassFish EJB FAQ的What is the syntax for portable global JNDI names in EJB 3.1?條目提供這一新公約的一個很好的總結。如果您想了解更多信息,請查看:http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names

0

我已經找到了!我認爲有一種「特殊方式」使用NetBeans添加和配置組件!我一直在閱讀網頁上的netbeans教程,顯然我做錯了什麼!那麼,這是不是對這個問題真正的解決辦法,但也許如果你讀這些http://netbeans.org/kb/trails/java-ee.html的一個,你會發現你的aswers!

Regards

0

我遇到了同樣的問題。我一派網絡,隨後從Oracle在線教程由線設立一個獨立的Java客戶端,但仍然沒有工作。我遇到了http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html,它有一個我已經嘗試解決該問題的信息。

我只是重新啓動我的IDE,清理並生成項目;也可能重新創建項目。誰知道,當月圓,我的代碼可以運行良好:)所以可能想嘗試太

0

我的獨立客戶端終於跑!竅門是,重新啓動Netbeans IDE,取消部署應用程序並重新部署它。這應該解決您的問題(假設代碼和配置中沒有其他錯誤)。