首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C-CDA验证失败,因为我的服务器中存在“未知类型”,而不是在独立项目中

C-CDA验证失败,因为我的服务器中存在“未知类型”,而不是在独立项目中
EN

Stack Overflow用户
提问于 2017-07-09 07:29:26
回答 2查看 257关注 0票数 1

我正在检查如何使用MDHT库来验证C-CDA文档,检查当前的实现,以便为我的项目创建验证web服务。我首先创建了一个Eclipse本地Java项目,将JAR添加到类路径中,并实现了代码。执行成功。但是,当我将相同的代码复制到我的web项目(使用Spring Boot创建)并发送执行此类代码的请求时,程序会失败。

为了更好地解释,我做了以下最小方法:

代码语言:javascript
复制
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);
    }
}

然后,我在测试项目中的以下main方法中使用了它

代码语言:javascript
复制
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中)

代码语言:javascript
复制
@RequestMapping(/*POST endpoint properties*/)
public ResponseEntity<Object> validateCCDAFile(@RequestBody MultipartFile file) throws IOException {
    ccdaService.executeMDHTCode(file.getBytes());
    return null;
}

在两种情况下都要测试的文档xml_ccda_invalid.xml包含以下内容:

代码语言:javascript
复制
<?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>

正如我所说的,测试项目版本可以正确终止。但是服务器版本抛出了以下异常:

代码语言:javascript
复制
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语句来检查输入数组的内容,它们在两种情况下都是相同的,所以这不是服务器处理文件的问题。

我不知道为什么会发生这种情况。我将服务器项目的所有jars文件放入测试项目的类路径中,它仍然可以工作,所以这不是一个类名冲突。它似乎只有在实际使用时才会受到干扰。

我能错过什么呢?

EN

回答 2

Stack Overflow用户

发布于 2017-07-09 20:49:21

这看起来是war文件部署的一个问题-- ActClinicalDocument是在org.eclipse.mdht.uml.hl7.vocab jar中定义的;如果您使用maven进行构建,可以查看以下maven示例https://github.com/mdht/mdht-models/tree/develop/examples/org.openhealthtools.mdht.cda.maven.example

如果没有,请确保在您的eclipse项目中,jars等包含在二进制构建中

票数 0
EN

Stack Overflow用户

发布于 2017-08-08 08:29:30

听起来您没有在独立项目中应用模式,或者可能不是相同的模式,所以它是在不参考验证过程的情况下进行验证的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44991653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档