2017-07-08 5 views
0

MDHTライブラリを使用してC-CDAドキュメントを検証し、現在の実装を見直し、私のプロジェクト。まずEclipseのローカルJavaプロジェクトを作成し、JARをクラスパスに追加してコードを実装しました。実行は成功しました。しかし、(Spring Bootで作られた)私のWebプロジェクトに同じコードをコピーし、そのようなコードを実行するリクエストを送信すると、プログラムは失敗します。私のサーバーでは「Unknown type」のためC-CDA検証に失敗しましたが、スタンドアロンプ​​ロジェクトにはありません

良く説明するために、私は以下の最小限の方法を作った。

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; 
} 

do両方のケースでテストするcument、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ステートメントを使用して、彼らは両方のケースでは同じなので、それはファイルのサーバー処理の問題ではありません。

なぜこのようなことが起こっているのかわかりません。私はサーバープロジェクトのすべてのjarファイルをテストプロジェクトのクラスパスに入れましたが、それはまだ動作していました。クラス名の衝突ではありません。それは実際に使用されるときにのみ干渉するようです。

どうすればよいですか?

答えて

0

warファイルの展開に問題があるように見えます - ActClinicalDocumentはorg.eclipse.mdht.uml.hl7.vocab jarで定義されています。ビルドのためにMavenを使用している場合は、https://github.com/mdht/mdht-models/tree/develop/examples/org.openhealthtools.mdht.cda.maven.example

次のMavenの例を見ていない場合は

+1

私はクラスパスをチェックし、上記のライブラリがサーバによってロードされています。私は多くのデバッグを行うことにしました。そして、問題を発見しました。レジストリとクラスローダーの初期化に関する問題でした。私は自分の発見で私の答えを更新します。 – lartkma

+0

@lartkma - 親切に答えを投稿してください。それは他の人に役立つでしょう! –

0

それはあなたではないように聞こえるなどのjarファイルがバイナリのビルドに含まれているEclipseのプロジェクトで確認することができますスタンドアロンプ​​ロジェクトにスキーマを適用するか、同じスキーマでない可能性があります。そのため、検証プロセスを参照することなく検証しています。

関連する問題