0

私はEJB2.xアプリケーションをテストしていました。2つのモジュールを別々に作成しました:

EJBモジュール:単純なステートレスセッションBeanが含まれています

Webモジュール:EJBモジュールを検索するための単一のサーブレットページが含まれています。使ってJboss 4.2.3いました。

最初に、EJBモジュールをデプロイしましたが、デプロイメントはうまくいきました。 次に、Webモジュールをデプロイしましたが、デプロイはうまくいきました。

次に、次のコードを使用してEJBモジュールを検索しました。

Context c = new InitialContext();
Object o = c.lookup("HelloJNDI"); // Line 1
HelloLocalHome rv = (HelloLocalHome) o; // Line 2
HelloLocal local =  rv.create(); 

ルックアップはうまくいきましたが(Line 1)、Line 2クラスキャスト例外が発生しました。

次に、上記のコードを2つのシナリオでテストします。

  1. EJBとWebモジュールを1つにパッケージ化しましたEAR moduleEAR次に、このモジュールをにデプロイするJBoss 4.2.3と、上記のルックアップコードは魅力のように機能しました。

  2. を使用しようとしJBoss 5ましたが、EJBモジュールとWebモジュールを別々にデプロイした場合でも、上記のルックアップコードはうまく機能しました。

では、JBoss 4で2つのモジュールを別々にデプロイしたときに、うまくいかなかったのはなぜですか?2つのモジュールが同じコンテナーにデプロイされているため、ローカルJNDIルックアップのみを使用します。何かが足りなかったのですか、それともこれはJBoss 4の欠陥ですか?

4

1 に答える 1

1

キャストの代わりに次のコードを使用してみてください。

HelloLocalHome rv = (HelloLocalHome)javax.rmi.PortableRemoteObject.narrow(o, HelloLocalHome.class);

それが機能する場合は、悪名高いクラスローディングの問題があります。(JBoss 5 のデフォルト サーバーが異なるクラスローディング メカニズムを使用する理由の 1 つ)。最も簡単なのは、それらを 1 つの EAR に配置することです (そのため、ホーム クラスとリモート クラスは 1 回読み込まれます)。Web アプリケーションの Home インターフェース クラスは、JNDI によって返されるクラスローダーとは異なるクラスローダーによってロードされます。

WAR ファイルのクラスまたは lib ディレクトリからインターフェイスを削除することもできます。

于 2012-05-20T06:53:28.483 に答える