2

リモート インターフェース「BookEJBRemote」を実装する「BookEJB」という名前の EJB があります。

BookEJB は次のように宣言されます。

@Stateless    
@Remote(BookEJBRemote.class)   
public class BookEJB implements BookEJBRemote{}

BookEJBRemote は次のように宣言されます。

@Remote
public interface BookEJBRemote
{}

単体テストを実行するファイルがあり、テストを実行するとエラーが発生しました。エラーメッセージは次のとおりです。

java.lang.ClassCastException: _BookEJBRemote_Wrapper cannot be cast to BookEJB

エラーのある行は次のとおりです。

BookEJB mediaEJB = (BookEJB) ctx.lookup("java:global/classes/BookEJB");

ここで何が起こっているのかわかりません...

4

1 に答える 1

5

リモート インターフェース (および一般的なインターフェース) の原則は、特定のインターフェースを実装するオブジェクトへの参照を持つクライアントは、オブジェクトの具象型を知る必要がないということです。インターフェイスがわかっている場合は、インターフェイスで定義されているメソッドを呼び出します。

インターフェースでメソッドを定義しないと意味がありません。

そして、このインターフェイスでメソッドを呼び出します:

BookEJBRemote book = (BookEJBRemote) ctx.lookup("java:global/classes/BookEJB");
int pages = book.getNumberOfPages();

EJB コンテナーは、すべての EJB をそのインターフェースを実装するオブジェクトでラップし、実際の EJB Bean インスタンスに委譲します。ただし、EJB Bean インスタンスでメソッドを呼び出す前に、トランザクションが開始されていること、呼び出し元にメソッドを呼び出す権利があることなどを確認します。

リモート インターフェースの場合、クライアントは別の JVM に存在し、BookEJB クラスにアクセスすることさえできません。リモート インターフェイスを実装するスタブ クラスのインスタンスを受け取るだけです。スタブは、メソッドが呼び出されると、引数をシリアライズし、ネットワーク要求をサーバーに送信し、サーバーからの応答を取得してデシリアライズし、呼び出し元に結果を返します。BookEJB インスタンスは、サーバー JVM 内にのみ存在します。

于 2012-05-01T06:52:41.197 に答える