Подтвердить что ты не робот

Получение исключения для класса, где оба класса одинаковы

Я выполняю проект JBoss SEAM, и когда я просматриваю форму, я получаю эту ошибку.

java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav

В любом случае тот же класс JPA, который связан с формой, отображаемой на экране, для меня не имеет смысла, почему это один и тот же класс, это кажется невозможным.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Убедитесь, что у вас есть только одна копия класса.

Ответ 3

Как объяснил Йоахим ранее, java.lang.ClassCastException обычно возникает, когда два загрузчика классов загружают классы с тем же именем. Однако я столкнулся с другой ситуацией, когда это может произойти.

Это может произойти с некоторой IDE, которая автоматически перезагружает измененные классы. В таких случаях могут быть более старые версии класса, сохраненные в памяти, вызывающие ClassCastException.

Вот несколько способов решения этой проблемы:

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

  • Сделать класс загружаемым подклассом класса, который уже загружен загрузчиком классов по умолчанию.

  • Сделать загружаемый класс реализованным интерфейсом, который уже загружен загрузчиком классов по умолчанию.

Подробнее здесь - http://www.jspwiki.org/wiki/A2AClassCastException

Ответ 4

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

Ответ 5

В моем случае у меня было два разных *.ear и я хотел загрузить класс из другого. Поэтому мне пришлось изолировать загрузчик классов. Я использовал это описание:

http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS

Это сработало для меня.