Hibernate java.lang.ClassCastException: _$$_javassist_856 нельзя преобразовать в javassist.util.proxy.Proxy при использовании общей библиотеки Websphere

Вебсфера 8.0.0.11

Спящий режим 4.2.21.Final

Я нашел много вопросов об этой же проблеме, но ни один из них не помог мне.

Если я развертываю приложение в Websphere, оно работает нормально.

Однако мы определили общую библиотеку, которая содержит все сторонние библиотеки (spring, hibernate, javassist и т. д.), чтобы наши WAR были тоньше.

Таким образом, во время развертывания мы связываем наш тонкий WAR с этой общей библиотекой Websphere.

Дело в том, что когда мы развертываем приложение таким образом, выбрасывается ClassCastException Hibernate exception _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy.

Я проверил загруженные банки в консоли веб-сферы и вижу только одну банку javassist (3.18.1-GA) в пути к классам.

Почему это могло происходить?

ОБНОВЛЕНИЕ

Я также пытался использовать загрузку классов PARENT_FIRST и PARENT_LAST.

ОБНОВЛЕНИЕ 2

Я только что узнал, что Websphere загружает свою собственную банку javassist:

URL location = ProxyFactory.class.getProtectionDomain().getCodeSource().getLocation(); 
logger.info("{}", location);

Он печатает: file:/opt/IBM/WebSphere/AppServer/plugins/javassist.jar


person codependent    schedule 01.08.2016    source источник


Ответы (2)


Перепробовав почти все, что я нашел на S.O. безуспешно я решил понизить Hibernate до версии 4.1.12.Final. Это максимальная версия 4.x, совместимая с Websphere 8.x.

person codependent    schedule 02.08.2016

Проблема в том, что Javassist оставляет следы в сгенерированном коде. Когда Javassist находится в пути к классам дважды, его классы загружаются дважды. Однако два типа равны только в том случае, если они имеют одно и то же имя и загружаются одним и тем же загрузчиком классов. В вашем случае сгенерированный класс разрешает свою зависимость Javassist к типу, который загружается вашим загрузчиком класса приложения, в то время как ваш код приводит экземпляр к типу Javassist, который загружается загрузчиком класса Websphere (или наоборот).

Разделяете ли вы какие-либо зависимости Hibernate между приложениями? Старайтесь не использовать какие-либо общие библиотеки, связанные с Hibernate, в вашем приложении, чтобы избежать этого.

person Rafael Winterhalter    schedule 01.08.2016
comment
Привет Рафаэль, спасибо за ответ. Да, мы разделяем ряд библиотек, определенных в общей библиотеке веб-сферы, чтобы облегчить наши тяжелые войны. До сих пор у нас был Spring 4.x + Hibernate 3.6, и все работало гладко. Javassist от Websphere должен быть совместим с тем, что есть в нашей общей библиотеке. К сожалению, похоже, что нет хорошего решения для этого... - person codependent; 02.08.2016
comment
Что вы можете сделать, так это затенить свою зависимость, чтобы поместить ее в другое пространство имен. - person Rafael Winterhalter; 02.08.2016