Проблема с ClassCastException

#java #casting #classcastexception

#java #Кастинг #classcastexception

Вопрос:

У меня есть следующий код:

 Object backingBean = facesContextHandler.getBackingBean("UserCredentialsBean");
UserCredentialsBean userCredentBean = (UserCredentialsBean) backingBean;
  

Пока я отлаживаю его, у меня есть следующее в моем представлении выражений в Eclipse:

backingBean.getClass() -> myPackage.UserCredentialsBean

Резервное копирование экземпляра моего пакета.Значение UserCredentialsBean -> false

Таким образом, приведение выше не выполняется…

Как это может быть?

Обновление: Дополнительный «симптом»: я получаю эту проблему после тайм-аута сеанса

Есть идеи?

Комментарии:

1. Я считаю, что было бы полезно иметь трассировку стека. Возможно, OP что-то пропустил в своем анализе, или, возможно, где-то есть больше деталей… Чем больше информации, тем больше шансов, что кто-то сможет помочь

2. Если «UserCredentialsBean» сохранен в области сеанса и время ожидания вашего сеанса истекло, тогда оно будет равно null. Это то, что происходит?

Ответ №1:

Интересный вопрос. Я могу думать только о двух возможностях.

1- Нулевой объект. instanceOf обычно завершается с ошибкой для нулевого объекта. Просто убедитесь, что компонент инициализирован.

Проблема с загрузчиком 2-го класса. Если два объекта одного и того же класса загружаются двумя разными загрузчиками классов, то instanceOf завершится ошибкой.

Это не полный список, всего две вещи, о которых я мог подумать.

Комментарии:

1. Значение backingBean не равно null. Eclipse показывает свои атрибуты как объекта UserCredentialsBean с заполненными данными.

2. Что касается проблемы с загрузчиком классов… Я должен подумать, как это могло произойти из-за какой-либо проблемы с загрузчиком классов.

3. Тогда вам, возможно, придется разобраться в проблеме с загрузчиком классов. Это правильное приложение JSF, и вы пытаетесь получить вспомогательный компонент в своем приложении. ??

4. Проблема с загрузчиком классов интересна, хотя приведение … хм… Что произойдет, если вы выполните динамическое приведение (используя отражение). Получите объект класса, а затем вызовите метод cast()

5. Да, правильно. И еще один момент… Я получаю эту проблему после тайм-аута сеанса

Ответ №2:

Проблема с загрузчиком классов наверняка. Скорее всего, приложение было перераспределено (таким образом, был создан новый экземпляр classloader), Но старый объект остался либо в сеансе (сериализованном на диске?), либо в памяти.

Имя класса то же самое, но экземпляр загрузчика класса отличается. Instanceof проверяет полное имя класса И равенство загрузчиков классов.

PS На самом деле это довольно распространенная проблема. Часто видно, когда фоновый поток просыпается только для того, чтобы узнать, что приложение было повторно передислоцировано, загрузчик классов потока исчез, а затем он выдает либо NoClassDefFound, либо ClassCast к большому удовольствию разработчиков, которые не всегда понимают, что это на самом деле зомби из предыдущего развертывания, и пытаются найти ошибку в своем коде.