2

grails 2.0.3 で開発したスタンドアロン クライアントから EJB サービスにアクセスする際に問題が発生しています。EJB サービスは、glassfish サーバー (Java) にデプロイされます。EJB にアクセスするために、このコードを netbeans テスター クラスでテストしました。

    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は、デプロイされたサービスへのパスを含む変数です。この場合、"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で実行するために多くの問題を抱えていました。InitialContext()呼び出しを行うことができるように、すべてのglassfish jar(ライブラリとモジュール)を取得する必要がありましたが、これがまだjarの問題なのか、それとも構成の問題またはそれが何であるか。

IllegalArgumentExceptionJavaで互換性のない型を割り当てようとすると発生することは知っていますが、そのようなものを設定していないため、内部メソッドの初期化であると想定しています。

問題は、なぜこの例外が発生するのですか??

私のサービスを grails からより適切に呼び出す別の方法はありますか??

4

1 に答える 1

2

エラーは、grails で tomcat プラグインを使用して (コマンド grails run-app を使用して) Web アプリケーションを実行しようとしていることです。問題は、GF 3.1 のクライアント ライブラリを使用している場合、InitialContext ( com.sun.enterprise.naming.SerialInitContextFactory) groovy を作成しようとすると、いくつかの型をキャストするときにエラーが発生することです。(これが問題であることは知っていますが、その理由は本当にわかりません。理論的にはこれでうまくいくはずです)

.war ファイルを生成して AppServer にデプロイすると、EJB に問題なく接続できます。また、別の GF サーバーにデプロイする場合、クライアント jar をインポートする必要はありません。

これは本番環境では完璧に機能しますが、唯一の問題は、わずかな変更を加えるたびにアプリをコンパイルして GF サーバーにデプロイする必要があることです。

GF の外部でコマンド " grails run-app" を使用して作業する場合は、grails アプリケーションがあるリモート サーバー上の 2 つの .jar GF 3.1 を変更する必要があります。

1- jar ファイル $GLASSFISH_HOME/modules/glassfish-corba-omgapi.jar

クラスをWebで検索し、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 クライアント jar を入れたくない場合は、クライアント マシンのクラスパスに次のライブラリを追加できます。

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

grails run-app コマンドで 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
于 2013-04-30T14:40:07.987 に答える