Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat cross context: ClassCastException: class cannot be cast to class / 20 сообщений из 20, страница 1 из 1
26.08.2020, 17:50
    #39992643
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Всем привет!

Tomcat 8 + 2 Web Spring boot приложения. App1 пишет объект Config в контекст. App2 читает объект Config из контекста App1. Библиотека c реализацией класса Config лежит в /shared/lib.

пишем в app1:
Код: java
1.
sce.getServletContext().setAttribute("Config", new Config());


читаем в app2:
Код: java
1.
2.
3.
ServletContext crossContext 
                = sce.getServletContext().getContext("/app1");
Config config = (Config) crossContext.getAttribute("Config");


Получаем ошибку:
авторjava.lang.ClassCastException: Config cannot be cast to Config
...
Рейтинг: 0 / 0
26.08.2020, 18:00
    #39992647
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
spring-boot-devtools удоли
...
Рейтинг: 0 / 0
26.08.2020, 18:03
    #39992649
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
dakeiras
spring-boot-devtools удоли

Этой нет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
...
Рейтинг: 0 / 0
26.08.2020, 18:26
    #39992655
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Molasar
Библиотека c реализацией класса Config лежит в /shared/lib.

Класс Config только там? Или еще в war-ах? Из war-ок этот класс надо убрать.
P.S. что вообще пытаешься сделать? - выглядит все очень не очень
...
Рейтинг: 0 / 0
26.08.2020, 19:00
    #39992661
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Одинаковые классы загруженные разными класслоадерами считаются разными. У каждого приложения свой класслоадер, так что вообще ничего удивительного
...
Рейтинг: 0 / 0
26.08.2020, 23:14
    #39992732
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
забыл ник
Одинаковые классы загруженные разными класслоадерами считаются разными. У каждого приложения свой класслоадер, так что вообще ничего удивительного

а как тогда передавать объекты через кросс контекст?
...
Рейтинг: 0 / 0
26.08.2020, 23:50
    #39992744
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Molasar
забыл ник
Одинаковые классы загруженные разными класслоадерами считаются разными. У каждого приложения свой класслоадер, так что вообще ничего удивительного

а как тогда передавать объекты через кросс контекст?

А смысл сего действия?
Но если говорить об интеграции приложений, то есть 4 основных способа
1) файловая система
2) БД
3) Очередь сообщений
4) remote call
...
Рейтинг: 0 / 0
27.08.2020, 07:38
    #39992796
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
забыл ник
Molasar
пропущено...

а как тогда передавать объекты через кросс контекст?

А смысл сего действия?
Но если говорить об интеграции приложений, то есть 4 основных способа
1) файловая система
2) БД
3) Очередь сообщений
4) remote call

5) REST))
...
Рейтинг: 0 / 0
27.08.2020, 08:15
    #39992800
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Molasar

Получаем ошибку:
авторjava.lang.ClassCastException: Config cannot be cast to Config


Не делай странного, не получишь странного.

Если нужен доступ к контексту/бинам между различными приложениями.
То я слышал о такой возможности только для серверов приложений (WebLogic, WebSphere, jBoss, Glassfish), а никак не для серверов сервлетов (Tomcat).
Можно конечно попробовать сделать через OSGI, но там "своя атмосфера".

А так. Если нужно иметь контекст двух приложений...
То это должен быть один контекст, для одного приложения! ;-)

Смотреть в сторону создание собственных автоконфигураций

<:o)
...
Рейтинг: 0 / 0
27.08.2020, 09:45
    #39992825
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
забыл ник
Одинаковые классы загруженные разными класслоадерами считаются разными. У каждого приложения свой класслоадер, так что вообще ничего удивительного


Я пробовал использовать разные библиотеки с общими классами. И такую проверку:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        Object result = crossContext.getAttribute("Config");
        
        System.out.println("Object classloader: " + result.getClass().getClassLoader());
        System.out.println("Target class classloader: " + Config.class.getClassLoader());
        
        if(result.getClass().getClassLoader() != Config.class.getClassLoader()) {
            System.out.println("Different classloaders detected!");
        }


В некоторых случаях класслоадеры одинаковые:
авторObject classloader: java.net.URLClassLoader@4f8cb7b
Target
class classloader: java.net.URLClassLoader@4f8cb7b
Там где разные такой вывод:
авторObject classloader: ParallelWebappClassLoader
context: ccproducer
delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@4f8cb7b

Target class classloader: ParallelWebappClassLoader
context: ccconsumer
delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@4f8cb7b

Different classloaders detected!
...
Рейтинг: 0 / 0
27.08.2020, 09:51
    #39992827
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
SpringMan
Molasar
Библиотека c реализацией класса Config лежит в /shared/lib.

Класс Config только там? Или еще в war-ах? Из war-ок этот класс надо убрать.
P.S. что вообще пытаешься сделать? - выглядит все очень не очень


Ваше предположение о наличие где-то еще одной библиотеки в классом Config похоже на правду. Проверю.
Кросс контекст нужен для использования общих объектов приложениями.
Например, в моем случае app1 помещает объект, который содержит информацию о состоянии app1. App2 постоянно считывает состояние этого объекта.

Я знаю про Очереди, БД, FS, Rest и Soap.
...
Рейтинг: 0 / 0
27.08.2020, 10:08
    #39992837
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Molasar,

>Я знаю про Очереди, БД, FS, Rest и Soap.
Если знаешь, значит фигню пишешь.
...
Рейтинг: 0 / 0
27.08.2020, 10:14
    #39992842
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Molasar,
> Например, в моем случае app1 помещает объект,
А то что повальное количество приложений общаются между собой через порт 127.0.0.1:123456.
Казалось бы причем тут сеть, если они меж собой общаются.
Но спринг прогерам обязательно надо через спринг)))
...
Рейтинг: 0 / 0
27.08.2020, 11:09
    #39992864
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
mad_nazgul
серверов сервлетов (Tomcat).
Контейнер сервлетов А так. Если нужно иметь контекст двух приложений...
То это должен быть один контекст, для одного приложения! ;-)Можно п(р)очитать про загрузчики классов, обнаружить "общий для экземпляра" и положить туда классы, общие для обоих приложений.

P.S.
Да, это не защитит от "вмешательства" третьего приложения, развёрнутого в том же экземпляре.
...
Рейтинг: 0 / 0
27.08.2020, 13:28
    #39992948
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
В моём случае ошибка возникала из-за присутсвия дубликата общей библиотеки в одном из war файлов.
Необходимо четко отслеживать такие моменты и исключать общие библиотеки через <scope>provided</scope> в POM файле MAVEN проектов.
...
Рейтинг: 0 / 0
27.08.2020, 14:38
    #39992993
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
В твоем случае ошибка возникала из-за отсутствия правильной архитектуры, приводящая к говнокоду.
Хозяин-барин
...
Рейтинг: 0 / 0
28.08.2020, 06:35
    #39993201
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Basil A. Sidorov
Можно п(р)очитать про загрузчики классов, обнаружить "общий для экземпляра" и положить туда классы, общие для обоих приложений.


На сколько я понял ТС не классы нужны, а контекст, созданный соответствующими конфигурационными классами.
Как только он создаст контекст, через кастомный класслоадер, второй вопрос будет, почему у него не работает контекст.
Типа я вызываю бин, в одном приложении, а в другом ничего не меняется.

Тут либо переход на сервер приложения и JavaEE.
Либо поднимать приложение в одном контексте.
Либо не парить мозги и делать какой-нибудь "типа RPC".
...
Рейтинг: 0 / 0
28.08.2020, 07:33
    #39993216
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
mad_nazgul,
Конечно контекст. Мы же var v = new Xxxxx() счас практически не пишем))
...
Рейтинг: 0 / 0
28.08.2020, 07:50
    #39993220
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
mad_nazgul
На сколько я понял ТС не классы нужны, а контекст, созданный соответствующими конфигурационными классами.
Да какая разница как создан контекст??? Если класс загружен общим загрузчиком, то его методы доступны из любого контекста.
Если хочется дёргать общие методы из разных контекстов, то эти классы должны грузиться общим загрузчиком. Для сервлет-контейнера это общий загрузчик экземпляра (${catalina.base}/lib/ для КотярыТома). Простая же логика.
...
Рейтинг: 0 / 0
01.09.2020, 14:10
    #39994471
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat cross context: ClassCastException: class cannot be cast to class
Basil A. Sidorov
mad_nazgul
На сколько я понял ТС не классы нужны, а контекст, созданный соответствующими конфигурационными классами.
Да какая разница как создан контекст??? Если класс загружен общим загрузчиком, то его методы доступны из любого контекста.
Если хочется дёргать общие методы из разных контекстов, то эти классы должны грузиться общим загрузчиком. Для сервлет-контейнера это общий загрузчик экземпляра (${catalina.base}/lib/ для КотярыТома). Простая же логика.


Класс доступен, а контекст нет ;-)
Грубо говоря класслоадер загружает классы, а объекты создаются в контексте.
ТС нужен не класс, а контекст. Т.к. все созданные бины.

Если все таки пытаться создавать два приложения, то либо нужно использовать JavaEE/JakartaEE, либо OSGI.
В любом случае это будет тот ещё геморрой.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat cross context: ClassCastException: class cannot be cast to class / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]