-1

次のメソッドを提供する RMI サービスがあります。

ArrayList<T> save(ArrayList<T> saveList) throws RemoteException;

その署名を次のように変更したい:

Collection<T> save(Collection<T> saveList) throws RemoteException;

これはコンパイル エラーにはならないので、すべて問題ないようです。しかし、クライアント アプリケーションがそのメソッドを実行しようとすると、次の例外が発生します。呼び出し元を変更していません。つまり、メソッドは引き続きArrayList.

java.lang.NoSuchMethodError: com/IDatabaseDao.sync(Ljava/util/ArrayList;)Ljava/util/ArrayList;

RMI の仕組みが詳しくわかりませんが、期待する String 表現がないためにメソッドが見つからないのではないでしょうか? 本当?したがって、ここですべての発信者を変更する必要がありますか、それとももっと良い方法がありますか?

ここではコンパイルエラーが発生しないため、これは非常にエラーが発生しやすいようです。そのような問題を認識するツール、おそらく Eclipse プラグインはありますか?

4

3 に答える 3

0

私が理解しているのは、以下はパラメーターの種類が異なるため、メソッド宣言が異なるということです。

ArrayList<T> save(ArrayList<T> saveList) throws RemoteException;
Collection<T> save(Collection<T> saveList) throws RemoteException;

Eclipseで2つのメソッドを1つのクラスに入れようとすると、IDEでコンパイルエラーが発生することはありません。これは、私の主張が正しいことを示しています。

Java RMIは、クライアントと同じ宣言が必要なメソッドのみをリモートで呼び出します。彼らはあなたが何をしているのかを見つけてNoSuchMethodErrorを与えるほど賢くはありません。

于 2012-05-04T09:27:48.453 に答える
0

エラー メッセージは明確です。そのようなメソッドが見つかりません。これは、メソッドが名前だけで定義されているのではなく、パラメーターと戻り値の型によっても定義されているためです。実質的に 1 つのメソッドを削除し、別のメソッドを作成しました。

ここで発信者を変更する必要があります。

于 2012-05-04T09:13:47.487 に答える
-2

クライアントを更新せずにサーバーエンドを変更しました。あなたはそれをすることはできません。変更されたリモートインターフェイスと、存在する場合はスタブをクライアントにデプロイし、影響を受けるクライアントコードを再コンパイルして、それも再デプロイする必要があります。

于 2012-05-04T10:34:01.150 に答える