ClassCastException в Spring Boot Web Application - PullRequest
0 голосов
/ 21 апреля 2020

Я добавляю подпружиненное приложение в существующий продукт и запускаю исключение ClassCastException, которое я не могу решить. Я считаю, что это связано с несколькими загрузчиками классов, но я не до конца понимаю, как решить эту проблему.

Приложение представляет собой сервер сокетов DICOM, и теперь я добавляю некоторые RestAPI для использования Spring-Boot.

Как часть индексации входящих данных DICOM, мне нужно проанализировать данные и при этом динамически загрузить класс анализатора значений.

У меня есть фабрика плагинов, построенная с использованием версии 2.2.1 из: org.xeustechnologies.jcl.JarClassLoader, который делает это. Он также кэширует классы, поскольку они используются снова и снова для каждой транзакции DICOM.

Фрагмент класса PluginFactory:

public Object load(String theClass, InputStream additionalJar) {

    Object plugin = null;

    try {
        JarClassLoader jcl = new JarClassLoader();
        if (additionalJar != null) {
            jcl.add(additionalJar);
        }

        plugin = alreadyLoaded.get(theClass);

        if (plugin == null) {

            JclObjectFactory factory = JclObjectFactory.getInstance();
            plugin = factory.create(jcl, theClass);

            alreadyLoaded.put(theClass, plugin);
            log.debug("Successfully loaded: "+theClass);
        }
    } catch (Exception e) {
        log.debug("Failed to load: "+theClass);
        log.error(e,e);
        plugin = null;
    }

    return plugin;
}

Этот метод загрузки из PluginFactory вызывается множество раз для каждая транзакция из класса индексации.

IValueParser parser = (IValueParser) pFactory.load(descriptor.getcClassName());
byte[] rowKey = parser.parse(node.getSourceObject(), sdo);

Это эффективно и безупречно работает в многопоточной среде сервера сокетов DICOM.

Проблема возникает при обработке загруженного файла DICOM через После этого я получаю следующую ошибку:

[DEBUG] 2020-04-20 19:28:35,428 [http-nio-8080-exec-1]  com.example.core.factory.PluginFactory load - Successfully loaded: com.example.core.model.schema.parser.StudyIndexRowKey
[ERROR] 2020-04-20 19:28:35,428 [http-nio-8080-exec-1]  com.example.core.db.HBase writeIndexEntry - java.lang.ClassCastException: com.example.core.model.schema.parser.StudyIndexRowKey cannot be cast to com.example.core.model.schema.parser.IValueParser
java.lang.ClassCastException: com.example.core.model.schema.parser.StudyIndexRowKey cannot be cast to com.example.core.model.schema.parser.IValueParser
    at com.example.core.model.schema.HBaseSchema.getRowKey(HBaseSchema.java:277)
    at com.example.core.db.HBase.writeIndexEntry(HBase.java:136)
    at com.example.core.db.HBaseIndexWriter.run(HBaseIndexWriter.java:58)
    at com.example.core.webservice.server.DicomRestApiController.uploadFile(DicomRestApiController.java:173)

Конечно StudyIndexRowKey реализует IValueParser, и он прекрасно работает, если он не работает под той же JVM, что и spring-boot.

Буду очень признателен за любые советы, как решить эту проблему!

...