Значение java.lang.ClassCastException: someClass несовместим с someClass - PullRequest
13 голосов
/ 18 марта 2011

У меня возникали случайные исключения в приложении XPages:

java.lang.ClassCastException: someClass incompatible with someClass.

Оба упомянутых класса одинаковы, это класс, используемый как сессионный компонент.Я не смог найти в Google что-нибудь, касающееся моей проблемы.Обычным объяснением этого было изменение элементов дизайна, а не мой случай.

Приложение XPage стало непригодным для использования (страницы, использующие сессионный компонент someClass) с того момента, пока не будет перезапущена задача http или не восстановлен файлface-config.xml.

В некоторых случаях это связано с другим исключением:

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found

Что стоит за этим поведением?

Ответы [ 4 ]

15 голосов
/ 18 марта 2011

Филипп Рианд объяснил это по электронной почте:

Это приведение класса происходит потому, что один и тот же класс был загружен дважды двумя разными загрузчиками классов. Таким образом, с точки зрения Java они отличаются и приведение не выполняется.

Теперь каждое приложение XPages имеет свой собственный загрузчик классов. Но этот загрузчик классов отбрасывается каждый раз, когда с приложением происходит изменение дизайна, например, через Domino Designer. Это необходимо, поскольку изменение XPages создает новый класс Java, который затем должен быть загружен вместо предыдущего. Когда это происходит, загрузчик классов сбрасывается и создается новый. Затем все связанные с приложением классы перезагружаются по мере необходимости, даже если они не менялись. Это обычное поведение, реализуемое серверами J2EE. Тем не менее, если ваш код кэширует объект в области действия, которая не отбрасывается при изменении дизайна, то это может произойти. Например, applicationScope & sessionScope в настоящее время не удаляются, когда происходит изменение дизайна, что может привести к этой проблеме. Это был дизайнерский выбор, так как отказ от областей иногда дает плохой опыт разработчика, но с этим недостатком.

Наконец, сохранение Face-config.xml работает в качестве обходного пути. Когда этот файл сохраняется, то весь модуль удаляется из памяти, включая области видимости. Это объясняет, почему он работает. Внесение изменений в пользовательский класс Java должно перезагрузить модуль и устранить проблему.

Так что, кажется, причина в том, что бины (даже косвенно) входят в sessionScope или applicationScope.

5 голосов
/ 18 марта 2011

Если один и тот же файл класса загружен в разные загрузчики классов, два результирующих Java-класса будут , а не одного и того же класса;вам не разрешат передавать экземпляры одного в функции, ожидающие другого.Как правило, если вы сталкиваетесь с такой проблемой, это потому, что у вас есть несколько дочерних загрузчиков классов, которые могут получить доступ к файлу jar, который не виден их общему родительскому загрузчику классов.Вам может понадобиться переместить банку, содержащую «someclass», в общий каталог библиотеки вместо (например) определенного каталога веб-приложения.

0 голосов
/ 20 июля 2018

Очистка проекта также делает это работает!

0 голосов
/ 03 июля 2014

Просто перенесу свой опыт сюда.

Когда я столкнулся с этой проблемой, я запускал свое приложение в среде CAT с несколькими JVM.Поскольку в среде ITG для меня успешно выполнялась та же сборка, я перезапустил обе JVM на CAT, и ошибка была устранена.Не совсем уверен, что это вызвало.

...