Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RMI ClassCastException $proxy, как с этим бороться? 
:(
    Опции темы
Rusico
Дата 18.10.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



Здравствуйте.

Пишу в данный момент RMI систему. Возникла проблема: как мне определить тип удалённого объекта, если обёрнут в Proxy?
И самое важное - как привести его к этому типу?

Если это делать как обычно, то возникает исключение ClassCastException $proxy to "anyType".

Ну очень надо приведение типов. smile

PM MAIL   Вверх
LSD
Дата 18.10.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Приведи код. Для proxy instanceof прекрасно работает.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Rusico
Дата 18.10.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



instanceof - работает, а вот (myType)remoteObject - нет
Код

getProduct((Service)object1, (Group)object2);


объекты object1 и object2 - получены с сервера RMI
PM MAIL   Вверх
LSD
Дата 18.10.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Ты хочешь сказать, что такой:
Код

if(object1 instanceof Service && object2 instanceof Group)
  getProduct((Service)object1, (Group)object2);

выкидывает ClassCastException?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Rusico
Дата 18.10.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



в данном случае instanceof я не использую, 
но в собственных реализациях метода equals классов ServiceImpl и GroupImpl использую и это работает
PM MAIL   Вверх
LSD
Дата 20.10.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(Rusico @  18.10.2007,  20:29 Найти цитируемый пост)
но в собственных реализациях метода equals классов ServiceImpl и GroupImpl использую и это работает

Т.е. ты хочешь сказать, что instanceof возвращает true, а потом идет ClassCastException?
Код такого поведения выложи.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Rusico
Дата 22.10.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



Код

public boolean equals(Object o)
{
    if(!(o instanceof MainObject))return false;
    MainObject object = (MainObject)o;
    try
    {
      if(object.getId().intValue() != this.getId().intValue())
        return false;
    }catch(Exception ex){ex.printStackTrace();return false;}
    return true;
}


это работает, хотя может быть, что исключение и происходит, но оно обрабатывается.

а когда я получаю с сервера объект, потом из клиента вызываю метод сервера, парамметром которого является этот объект,
и в этом методе привожу этот объект (а он уже Proxy-объект) к нужному типу, то возникает ошибка.

вот этот метод:

Код

public void Select(MainObject[] objects)
    {
      try
      {
        MainObject[] subObjects = editor.getSelectedObjectsWithChildsAndParents();
        
        for(int i=0;i<subObjects .length;i++)
          services[i] = (Service)subObjects[i]; // Вот здесь наступает момент истины
        
        for(int i=0;i<objects.length;i++)
          groups[i] = (Group)objects[i]; // И здесь наступает момент истины

       // далее...
      }catch(Exception ex){ex.printStackTrace();}
    }

PM MAIL   Вверх
LSD
Дата 22.10.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



1. У тебя в методе equals() нет проверки что getId() возвращает не null, а значет может быть Exception и результат false (кстати try/catch здесь совсем не нужен, он только мешает). Или у тебя id гарантированно не нулевое?

2. Как второй кусок кода связан с первым? Я там что-то никакого equals() или instanceof не увидел.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Rusico
  Дата 22.10.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



try/catch здесь нужен, так как метод public Integer getId() throws RemoteException

null - ом быть может, проверка есть, но я её не показал

Первый кусок кода - нормально работающий с удалёнными объектами. Tип MainObject, к которому я там привожу объект, общий для всех других объектов в моём приложении

а второй кусок кода - не работает, хотя там тоже есть приведение типов. Классы Service и Group унаследованны от MainObject. Я его выложил, чтоб показать где у меня происходит ошибка

Кстати вот ещё:

домустим object1 - объект типа MainObject находящийся на сервере, а object2 - объект типа MainObject который пришёл с клиента, то при сравнении их получается интересная штука:

Код

object1.equals(object2) // всё в норме, т.е. метод equals вызывается из object1 и работает так как определён в MainObject


Код

object2.equals(object2) // то метод equals вызывается из класса Proxy :)


Ныпонятно  smile 
PM MAIL   Вверх
LSD
Дата 22.10.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(Rusico @  22.10.2007,  19:16 Найти цитируемый пост)
а второй кусок кода - не работает, хотя там тоже есть приведение типов. Классы Service и Group унаследованны от MainObject. Я его выложил, чтоб показать где у меня происходит ошибка

Так где там делается проверка на, то что класс действительно нужного типа:
Код

for(int i=0; i<subObjects.length; i++)
{
  if(subObjects[i] instanceof Service)
    services[i] = (Service) subObjects[i]; 
}



Цитата(Rusico @  22.10.2007,  19:16 Найти цитируемый пост)
домустим object1 - объект типа MainObject находящийся на сервере, а object2 - объект типа MainObject который пришёл с клиента, то при сравнении их получается интересная штука:

Ты же не декларировал equals() в своем интерфейсе. Можешь сделать в MainObject статический метод equals(MainObject, MainObject) и использовать его при сравнении.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Rusico
Дата 24.10.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

Репутация: нет
Всего: нет



на счёт первого - я точно знаю что они этого типа
И причём ошибка-то возникает в том что не получается преобразовать Proxy к Service(Group),

А на счёт второго - попробую
PM MAIL   Вверх
LSD
Дата 24.10.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(Rusico @  24.10.2007,  11:10 Найти цитируемый пост)
на счёт первого - я точно знаю что они этого типа

Откуда ты это знаешь? Просто добавь один if и убедись smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.