2010-03-03 3 views
20

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

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

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

ответ

31

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

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

+1

У меня такая же проблема. Есть ли способ обойти это? – andronikus

+1

@Joachim Sauder: Как можно устранить эту проблему, есть ли способ обойти это? – Rachel

+0

Решение: использование интерфейса в качестве посредника. – msangel

5

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

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

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

2

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

5

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

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

Вот несколько способов, которыми вы могли бы решить эту проблему:

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

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

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

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

2

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

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

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

+0

Я столкнулся с той же проблемой. Представленный url, похоже, теперь недоступен. В любом случае, не могли бы вы объяснить или сообщить мне какие-либо шаги ... БОЛЬШАЯ ПОМОЩЬ для меня ... –

+0

i обновил URL-адрес –

Смежные вопросы