Получение исключения для класса, где оба класса одинаковы
Я выполняю проект JBoss SEAM, и когда я просматриваю форму, я получаю эту ошибку.
java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav
В любом случае тот же класс JPA, который связан с формой, отображаемой на экране, для меня не имеет смысла, почему это один и тот же класс, это кажется невозможным.
Ответы
Ответ 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
Это сработало для меня.