9

JavaアプリケーションクライアントからEJBのメソッドを呼び出そうとして問題が発生しました。これがコードです。

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:global / Test / HelloBeanExample、java:global / Test / HelloBeanExample!com.test.HelloBeanRemote]

情報:EJB HelloBeanのGlassfish固有の(移植性のない)JNDI名例:[ejb / HelloBean、ejb / HelloBean#com.test.HelloBeanRemote]

だから私は次のエントリで試しましたが、同じ例外が発生しました:

  1. java:global / Test / HelloBeanExample
  2. java:global / Test / HelloBeanExample!com.test.HelloBeanRemote
  3. ejb / HelloBean
  4. ejb / HelloBean#com.test.HelloBeanRemote

Netbeans6.8とGlassfishv3を使用しています。

4

4 に答える 4

17

実際、問題はBeanのJNDI参照のルックアップではなく、次のようなものになります。

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

いいえ、ここでは、単純なクラスパスの問題が疑われます。クライアントプロジェクトのクラスパスにjarがないだけです。GlassFish v3では、スタンドアロンJavaクライアントからリモートEJBコンポーネントにアクセスするにはどうすればよいですか?で説明したよう$GF_HOME/modules/gf-client.jarに、追加するだけで十分です。GlassFishのEJBFAQにあります(私の理解では、このjarは、GFv2との互換性の理由で存在するjarを置き換えることになっています)。ただし、GlassFishインストールディレクトリから参照することが重要です。参照しないと、マニフェストで宣言されているjarが見つかりません。$GF_HOME/lib/appserv-rt.jargf-client.jar

gf-client.jarGlassFishインストールディレクトリから他の多くの.jarを参照するため、別の場所にコピーするのではなく、インストールディレクトリ自体から参照することをお勧めします。

これを修正すると、GlassFishがログに出力するJNDI名を使用してBeanを検索できるようになります。JavaEE6の新しいポータブルグローバルJNDI名を使用することをお勧めします。

念のため、EJB 3.1のポータブルグローバルJNDI名の構文は何ですか?GlassFish EJB FAQからのエントリは、この新しい規則の優れた要約を提供します。さらに詳しい情報が必要な場合は、http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_namesを確認してください。

于 2010-01-19T02:37:29.453 に答える
0

何か見つけました!NetBeansを使用してコンポーネントを追加および構成する「特別な方法」があると思います。私はWebページからnetbeansのチュートリアルを読んでいて、どうやら私は間違ったことをしていました!したがって、これはこの問題の実際の解決策ではありませんが、これらのhttp://netbeans.org/kb/trails/java-ee.htmlのいずれかを読むと、あなたの答えが見つかるかもしれません。

よろしく

于 2010-04-05T14:51:43.947 に答える
0

私は同じ問題に遭遇しました。Webをグーグル で検索し、Oracleのチュートリアルに従って、スタンドアロンのJavaクライアントをセットアップしましたが、それでも何も機能しません。http://glassfish.java.net/javaee5/ejb/EJB_FAQ.htmlに出くわしましたが、すでに問題を解決しようとしたという情報があります。

IDEを再起動し、プロジェクトをクリーンアップしてビルドします。プロジェクトを新たに作成することもできます。そして、誰が知っているか、月が満月になると、私のコードはうまくいくかもしれません:)だから、それも試してみたいかもしれません

于 2012-04-11T19:03:15.177 に答える
0

私のスタンドアロンクライアントがついに実行されました!秘訣は、Netbeans IDEを再起動し、アプリケーションをアンデプロイして再デプロイすることでした。これで問題が解決するはずです(コードと構成に他のエラーがないと仮定します)。

于 2012-04-12T13:51:38.860 に答える