不容易将签名切换到基类?

时间:2012-05-04 09:04:10

标签: java rmi nosuchmethoderror

我有一个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插件?

3 个答案:

答案 0 :(得分:0)

错误消息很明确:找不到这样的方法。这是因为该方法不仅仅由其名称定义,而且还由参数和返回类型定义。你几乎删除了一个方法并创建了另一个方法。

你必须在这里更改来电者。

答案 1 :(得分:0)

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

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

你可以尝试将这两个方法放在Eclipse中的一个单独的类中,IDE不会给出任何编译错误,这可以说明我的观点是真的。

Java RMI只会远程调用该方法,该方法必须与Client具有相同的声明。他们不是那么聪明,无法找到你正在做的事情然后给出NoSuchMethodError。

答案 2 :(得分:-2)

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