Сбой проверки C-CDA из-за "неизвестного типа" на моем сервере, но не в автономном проекте

Я проверял, как использовать библиотеки MDHT для проверки документов C-CDA, просматривая текущие реализации, чтобы создать веб-службу проверки для моего проекта. Сначала я создал локальный Java-проект Eclipse, добавил JAR-файлы в classpath и реализовал код. Казнь прошла успешно. Но когда я копирую тот же код в свой веб-проект (созданный с помощью Spring Boot) и отправляю запрос, который выполняет такой код, программа завершается ошибкой.

Чтобы объяснить лучше, я сделал следующий минимальный метод:

public void executeMDHTCode(byte[] fileContents) {
    System.out.println(Arrays.toString(fileContents));
    ValidationResult result = new ValidationResult();
    ClinicalDocument doc = null;

    try {
        ConsolPackage.eINSTANCE.eClass();
        doc = CDAUtil.load(new ByteArrayInputStream(fileContents), result);
    } catch (ClassCastException|SAXParseException|Resource.IOWrappedException e) {
        doc = null;
    } catch (Exception e) {
        throw new RuntimeException("Unknown error: " + e.getMessage(), e);
    }
}

Затем я использовал его в следующем основном методе в моем тестовом проекте

public static void main(String[] args) throws IOException { 
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
    int b = -1;
    InputStream stream = AppTest.class.getResourceAsStream("xml_ccda_invalid.xml");
    while((b = stream.read()) != -1) {
        outstr.write(b);
    }

    executeMDHTCode(outstr.toByteArray());   // only added 'static'
}

А затем использовал тот же код в моем проекте сервера (инкапсулируя его в ccdaService)

@RequestMapping(/*POST endpoint properties*/)
public ResponseEntity<Object> validateCCDAFile(@RequestBody MultipartFile file) throws IOException {
    ccdaService.executeMDHTCode(file.getBytes());
    return null;
}

Документ для проверки в обоих случаях, xml_ccda_invalid.xml, содержит следующее:

<?xml version="1.0" encoding="UTF-8"?>
<ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd">
  <realmCode code="US"/>
</ClinicalDocument>

Как я уже сказал, версия тестового проекта завершается корректно. Но версия сервера выдает следующее исключение:

java.lang.UnsupportedOperationException: Unknown type ([vocab, ActClinicalDocument, DOCCLIN])
    at org.eclipse.mdht.uml.cda.operations.ClinicalDocumentOperations.validateClassCode(ClinicalDocumentOperations.java:133) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.impl.ClinicalDocumentImpl.validateClassCode(ClinicalDocumentImpl.java:1659) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAValidator.validateClinicalDocument_validateClassCode(CDAValidator.java:1769) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAValidator.validateClinicalDocument(CDAValidator.java:1753) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAValidator.validate(CDAValidator.java:1075) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.emf.ecore.util.EObjectValidator.validate(EObjectValidator.java:324) ~[org.eclipse.emf.ecore-2.12.0.v20160420-0247.jar:?]
    at org.eclipse.emf.ecore.util.Diagnostician.doValidate(Diagnostician.java:171) ~[org.eclipse.emf.ecore-2.12.0.v20160420-0247.jar:?]
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:158) ~[org.eclipse.emf.ecore-2.12.0.v20160420-0247.jar:?]
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:137) ~[org.eclipse.emf.ecore-2.12.0.v20160420-0247.jar:?]
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:108) ~[org.eclipse.emf.ecore-2.12.0.v20160420-0247.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAUtil.validate(CDAUtil.java:707) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAUtil.validate(CDAUtil.java:696) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAUtil.performEMFValidation(CDAUtil.java:830) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAUtil.load(CDAUtil.java:277) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at org.eclipse.mdht.uml.cda.util.CDAUtil.load(CDAUtil.java:252) ~[org.eclipse.mdht.uml.cda-3.0.0.201706220503.jar:?]
    at companypackage.service.impl.CCDAServiceImpl.executeMDHTCode(CCDAServiceImpl.java:109) ~[bin/:?]
    at companypackage.controller.CCDAController.validateCCDAFile(CCDAController.java:32) ~[bin/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_102]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_102]
    at (other spring and apache calls...)

Я использовал println оператор для проверки содержимого входного массива, и они в обоих случаях идентичны, так что это не вопрос обработки файла сервером.

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

Чего мне не хватать?

2 ответа

Похоже, что вы не применяете схему в своем автономном проекте или, может быть, не ту же схему, поэтому она проверяется без ссылки на процесс проверки.

Похоже, что проблема с развертыванием файла войны - ActClinicalDocument определен в jar org.eclipse.mdht.uml.hl7.vocab; Если вы используете maven для сборки, вы можете посмотреть следующий пример maven https://github.com/mdht/mdht-models/tree/develop/examples/org.openhealthtools.mdht.cda.maven.example

если нет, убедитесь, что в вашем проекте eclipse файлы jar и т. д. включены в двоичную сборку.

Другие вопросы по тегам