ClassCastException при приведении к тому же классу - PullRequest
51 голосов
/ 05 мая 2009

У меня есть 2 разных проекта Java, у одного есть 2 класса: dynamicbeans.DynamicBean2 и dynamic.Validator.

В другом проекте я динамически загружаю оба этих класса и сохраняю их в Object

class Form {
    Class beanClass;
    Class validatorClass;
    Validator validator;
}

Затем я создаю объект Validator, используя validatorClass.newInstance(), и сохраняю его в validator, затем создаю объект bean, используя beanClass.newInstance(), и добавляю его в сеанс.

portletRequest.setAttribute("DynamicBean2", bean);

В течение жизненного цикла проекта Form я вызываю validator.validate(), который загружает ранее созданный объект EJB из сеанса (я использую Websphere Portal Server). Когда я пытаюсь преобразовать этот объект обратно в DynamicBean2, происходит сбой с ClassCastException.

Когда я вытаскиваю объект из сеанса, используя

faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);

и проверьте его класс, используя .getClass() Я получу dynamicbeans.DynamicBean2. Это класс, к которому я хочу привести его, однако при попытке получить ClassCastException.

Любая причина, почему я получаю это?

Ответы [ 11 ]

0 голосов
/ 23 февраля 2012

У меня была такая же проблема при использовании нескольких экземпляров JBoss на разных машинах. К сожалению, я не наткнулся на этот пост ранее.
Были артефакты, развернутые на разных машинах, два из них объявили загрузчики классов с одинаковым именем. Я изменил одно из имен загрузчиков классов, и все работало нормально => Остерегайтесь Copy & Paste!

Почему в исключении ClassCastException не упоминаются загрузчики классов? - Думаю, это была бы очень полезная информация.
Кто-нибудь знает, будет ли что-то подобное в будущем? Потребность в проверке класса грузчиков из 20-30 артефактов не так уж и приятна. Или я что-то пропустил в тексте исключения?

РЕДАКТИРОВАТЬ : я отредактировал файл META-INF / jboss-app.xml и изменил имя загрузчика, идея в том, чтобы иметь уникальное имя. На работе мы используем идентификатор артефакта (уникальный) в сочетании с версией, вставленной maven ({$ version}) во время сборки.
Использование динамических полей является необязательным, но помогает, если вы хотите развернуть разные версии одного и того же приложения.

<jboss-app>
   <loader-repository> 
   com.example:archive=unique-archive-name-{$version}
   </loader-repository> 
</jboss-app>

Вы можете найти некоторую информацию здесь: https://community.jboss.org/wiki/ClassLoadingConfiguration

...