-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 的详细工作原理,但似乎找不到该方法,因为它没有预期的字符串表示形式?真的吗?所以我必须在这里改变所有来电者,还是有更好的方法?

这似乎很容易出错,因为我在这里没有编译错误。是否有识别此类问题的工具,也许是 Eclipse 插件?

4

3 回答 3

0

我的理解是,由于参数类型不同,以下是不同的方法声明:

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

您可以尝试将这两种方法放在 Eclipse 中的一个类中,IDE 不会给出任何编译错误,这可以很好地表明我的观点是正确的。

Java RMI 只会远程调用必须与客户端有相同声明的方法。他们没有那么聪明地发现你在做什么,然后给出一个 NoSuchMethodError。

于 2012-05-04T09:27:48.453 回答
0

错误信息很清楚:没有找到这样的方法。这是因为该方法不仅由其名称定义,还由参数和返回类型定义。您实际上删除了一种方法并创建了另一种方法。

您必须在此处更改呼叫者。

于 2012-05-04T09:13:47.487 回答
-2

您已经更改了服务器端而没有更新客户端。你不能那样做。您需要将更改的远程接口和存根(如果有)部署到客户端,并重新编译任何受影响的客户端代码并重新部署它。

于 2012-05-04T10:34:01.150 回答