我有一个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插件?
答案 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)
您已更改服务器端而未更新客户端。你不能这样做。您需要将更改的远程接口和存根(如果有)部署到客户端,并重新编译任何受影响的客户端代码并重新部署它。