Причину точную невозможно точно определить с помощью предоставленной вами информации.Тем не менее, класс проблемы легко определить:
java.lang.ClassCastException:
com.fsvps.clientPortal.domain.common.UserContext cannot be cast to
com.fsvps.clientPortal.domain.common.UserContext
(разделены на строки, чтобы проиллюстрировать идентичное имя класса)
Всякий раз, когда класс не может быть приведен к типу или законный суперкласс / интерфейс, вы имеете дело с дублированным кодом: для загрузчика классов доступны две версии класса с одинаковым именем, и система выбирает обе.
В качестве ошибкисообщение содержит только имя класса, а не его загрузчик, первый взгляд на сообщение об ошибке не имеет смысла.Зная, что класс уникально описывается своим пакетом, именем и , его загрузчик классов приводит вас к основной причине.
Определите ваши модули и убедитесь, что для com.fsvps.clientPortal.domain.common.UserContext
есть только одна опциядоступны.
Редактировать : Отвечая на ваши комментарии - не зная деталей вашего развертывания, нет другого способа помочь вам, кроме диких догадок.Пожалуйста, добавьте больше информации в свой вопрос, если следующее дикое предположение не помогает:
Имя класса, UserContext
, предполагает, что вы можете хранить его где-нибудь, например, в сеансе.Это предотвратит выгрузку исходного класса, когда вы удаляете плагин. Обратите внимание, что между неразвертыванием кода и объектами сбора мусора существует огромная разница : сборщик мусора может происходить только тогда, когда больше нет ссылок.
Если вы развернете обновленную версию вашего плагина, старые и существующие объекты по-прежнему будут ссылаться на ранее загруженный класс UserContext
, в то время как новый код пытается присвоить его новой ссылке UserContext
.Несмотря на то, что оба могут быть идентичными в реализации, это разные классы, которые просто разделяют имя.
Вы не можете долго хранить ссылки на код, который может быть развернут, и ожидать, что он останется пригодным для использования.Быстрое исправление (если вы развертываете модули OSGi) может заключаться в извлечении стабильных и долго используемых классов в свой собственный пакет, который вы не будете повторно развертывать.Или замените хранимые в сеансе объекты (при условии, что это так) классами времени выполнения Java, например, Map встроенных типов, и создайте объект UserContext
из этих типов всякий раз, когда вам это нужно.