2012-05-04 3 views
-1

У меня есть сервис RMI, который обеспечивает следующий метод:Невозможно легко переключить подпись на базовые классы?

Я хочу изменить свою подпись:

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

Это не приводит к ошибкам компиляции, так что кажется, что все будет хорошо , Но когда клиентское приложение пытается выполнить этот метод, я получаю следующее исключение. Я не изменил вызывающих, что означает, что метод все еще вызывается с помощью ArrayList.

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

Я не знаю, как RMI работает подробно, но мне кажется, что этот метод не может быть найден, потому что он не имеет ожидаемое представление строки? Это правда? Поэтому мне пришлось бы менять всех звонящих здесь, или есть лучший способ?

Это, кажется, очень подвержено ошибкам, потому что здесь нет ошибок компиляции. Есть ли инструмент, который распознает такие проблемы, возможно, подключаемый модуль Eclipse?

ответ

0

сообщение об ошибке понятно: такой метод не найден. это потому, что метод не определяется только его именем, но также параметрами и типами возврата. вы практически удалили один метод и создали другой.

вы ДОЛЖНЫ изменить вызывающего абонента здесь.

0

Что я понимаю, что ниже различные объявления методов из-за различного типа параметра:

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

Где можно попробовать поставить два метода в одном классе в Eclipse, интегрированная среда не дает никаких компиляции ошибок, которые могут довольно показать мою точку зрения.

Java RMI будет вызывать только метод удаленно, который должен иметь такое же объявление с клиентом. Они не настолько умны, чтобы узнать, что вы делаете, а затем получили NoSuchMethodError.

+0

Нет разницы между двумя строками кода, которые вы опубликовали, а остальная часть не имеет большого смысла. – EJP

+0

К сожалению, это опечатка. Просто переконфигурируйте его. –

+0

Ваш последний абзац до сих пор не имеет смысла. Бросание NoSuchMethodError - это именно то, что происходит. Я не знаю, почему вы говорите иначе, но в этом смысл того, что вы написали, поскольку это означает что-либо вообще. Попробуй еще раз. – EJP

-2

Вы изменили серверный конец без обновления клиента. Вы не можете этого сделать. Вам необходимо развернуть измененный удаленный интерфейс и заглушку, если таковые имеются, клиенту, а также перекомпилировать любой затронутый код клиента и перераспределить его.

+0

@ user714965 RMI имеет точно такой же интеллект, как и Java-компилятор. Компилятор Java не справится с этими изменениями больше, чем RMI. Если вы измените интерфейс, вам придется его повторно развернуть. – EJP

+0

@ user714965 Я немного заговорил. Если бы вы перекомпилировали клиентский код с новым интерфейсом, как я сказал выше, это сработало бы. Когда вы выполнили старый класс клиента с новым определением интерфейса, он не сработал. Это потому, что вы не скомпилировали его. Это вовсе не имеет отношения к RMI. – EJP

+0

@ user714965 Другими словами, у вас нет доказательств вашей веры, и у вас есть контр-доказательство того, что ваш код не работает. Вы объясняете таинственные полномочия RMI, которых у него просто нет.Он полагается на компилятор и отражение. Если вы исследуете трассировку стека, вы это увидите сами. – EJP

Смежные вопросы