2013-01-23 61 views
2

我一直有問題從我在grails 2.0.3上開發的獨立客戶端訪問我的EJB服務。 EJB服務部署在Glassfish服務器(Java)上。我測試了一個NetBeans測試類的代碼來訪問EJB的:如何從grails獨立客戶端訪問EJB服務

Properties p = new Properties(); 
    p.put("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); 
    p.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
    p.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
    p.setProperty("org.omg.CORBA.ORBInitialHost", INTEGRATION_IP); 
    p.setProperty("org.omg.CORBA.ORBInitialPort", CORBA_PORT); 
    ctx = new InitialContext(p); 
    try { 
     this.admAuth = (AdmAuthenticationRemote) this.ctx.lookup(Tester.AUTHENTICATION_SERVICE_JNDI); 
    }catch(Exception e){ 
     ... 
    } 

Tester.AUTHENTICATION_SERVICE_JNDI是一個變量THA包含路徑部署的服務,在這種情況下,像"java:global/..."表示地址是服務被請求。這種訪問服務的方式完全可以從測試程序中完成,但是當我嘗試從grails執行相同的操作時不起作用。我能夠創建上下文以同樣的方式,但是當我調用ctx.lookup()呼叫我得到一個異常:

Message: Lookup failed for 'java:global/...' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 
Cause: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 
[Root exception is java.lang.RuntimeException: Orb initialization erorr] 

主要的例外是命名異常,這意味着它在ctx.lookup()失敗,但原因是orb初始化異常,它有另一個異常堆棧:

java.lang.RuntimeException: Orb initialization erorr 
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Can not set long field com.sun.corba.ee.impl.orb.ORBDataParserImpl.waitForResponseTimeout to java.lang.Integer 
Caused by: java.lang.IllegalArgumentException: Can not set long field com.sun.corba.ee.impl.orb.ORBDataParserImpl.waitForResponseTimeout to java.lang.Integer 

我真的迷失在這裏。我一直有很多問題需要通過grails來完成,我必須得到所有glassfish罐(庫和模塊),以便能夠調用InitialContext(),但現在我不確定這是否仍然是jar問題或配置問題或它是什麼。

我知道IllegalArgumentException發生在你嘗試在java中分配不兼容的類型,但我沒有設置類似的東西,所以我假設它的內部方法初始化。

所以問題是爲什麼這個例外即將到來?

是否有另一種方式來從grails調用我的服務更好?

回答

2

錯誤是,您正嘗試在grails中使用tomcat插件運行您的web應用程序(使用命令grails run-app)。問題是,當您嘗試創建InitialContext(com.sun.enterprise.naming.SerialInitContextFactory)時,如果您使用GF 3.1的客戶端庫,groovy會給您帶來一些轉換錯誤。 (我知道這是問題,但我真的不知道這個原因,因爲理論上這應該起作用)

如果生成.war文件並在AppServer中部署,則可以連接到你的EJB沒有問題。如果您將其部署到另一臺GF服務器上,則無需導入任何客戶端罐。

這將在生產中完美工作,唯一的問題是,您必須在GF服務器上編譯和部署您的應用程序,並進行一些小改動,這在開發過程中有點煩人。

如果你想GF和使用命令「grails run-app」在外面工作,你必須在遠程服務器上,在那裏你有Grails應用程序上修改兩個的.jar GF 3.1:

1-罐子文件$ GLASSFISH_HOME/modules/glassfish-corba-omgapi。罐子

你應該在網絡搜索類com.sun.corba.ee.spi.orb.ParserImplBase,並修改這部分

Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, value); 

if (name.equalsIgnoreCase("waitForResponseTimeout")) { 
    Object newValue = new Long(1800000); 
    Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, newValue); 
} else { 
    Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, value); 
} 

這應該解決的java.lang.IllegalArgumentException異常

2- jar文件$ GLASSFISH_HOME/modules/glassfish-corba-orb.jar

您必須刪除javax.rmi.CORBA.PortableRemoteObjectClass類這個庫的,因爲這個類有一個使用的Grails的插件

PS衝突: 如果你不想在你的Grails應用程序的GF客戶端罐子,你可以添加你的客戶端機器的類路徑以下庫

$GLASSFISH_HOME/modules/ejb-container.jar 
$GLASSFISH_HOME/modules/ejb.security.jar 
$GLASSFISH_HOME/modules/management-api.jar 

如果您使用的Grails的Grails的控制檯運行應用程序的命令,必須修改配置文件$ GRAILS_HOME/conf目錄/ Groovy的starter.conf白衣這個

load $GLASSFISH_HOME/modules/ejb-container.jar 
    load $GLASSFISH_HOME/modules/ejb.security.jar 
    load $GLASSFISH_HOME/modules/management-api.jar 
+0

+1用於描述錯誤。 –

相關問題