Караф ClassCastException - PullRequest
       64

Караф ClassCastException

0 голосов
/ 03 апреля 2020

Караф версия 4.2.4.

Когда я развертываю пакеты в первый раз - все работает, как ожидалось, но если я удаляю пакеты (из каталога развертывания) и выполняю их развертывание снова (копировать в каталог развертывания), Я получу сообщение об ошибке "java .lang.ClassCastException: test.Test не может быть приведено к test.Test" во время выполнения и сбой контейнера проекта. Я предлагаю эту ошибку, вызванную использованием разных загрузчиков классов, но я не могу понять, как этого избежать? Может быть, мне нужно использовать специальные команды karaf для отмены / развертывания?

Основной вопрос - как повторно развернуть пакеты без остановки сервера?

Описание. У меня есть 3 комплекта:

  1. источник данных - используется для создания экземпляра DataSource и помещается в контейнер чертежей. Нет java кода - чертежа. xml только конфигурация
...
<service interface="javax.sql.DataSource" ref="dataSource" />
...
домен - внедряет источник данных и создает сервис, который использует mybatis mapper. POJO также описан здесь.

план. xml:

<reference id="datasource" interface="javax.sql.DataSource"/>

<bean id="managerimpl" class="test.TestManagerImpl">
    <argument ref="datasource"/>
</bean>

<service id="testmanager" interface="test.TestManager" ref="managerimpl"/>

Класс обслуживания:

public class TestManagerImpl implements TestManager {
    private final Mapper mapper;
    private final DataSource dataSource;

    public TestManagerImpl(DataSource dataSource) {
        this.dataSource = dataSource;
        this.mapper = MybatisSqlSessionGetter.getSqlSessionMapperInstance(dataSource, Mapper.class);
    }

    @Override
    public Test getTestById(String id) {
        return mapper.getById(id);
    }
    ...
}

POJO:

public class Test {
    private String id;
    private String name;
    ...
}   
зависимый - внедряет сервис из комплекта домена и использует его для получения POJO.

blueprint. xml:

<reference id="testmanager" interface="test.TestManager"/>

<bean id="dependentService" class="test.DependentService">
    <argument ref="testmanager"/>
</bean>
...

Сервис:

public class DependentService {
    private final TestManager manager;

    public DependentService(TestManager manager) {
        this.manager = manager;
        Test testById = manager.getTestById("uuid");        // ClassCastException
    }
}
...