2014-10-31 60 views
5

以下相關性正在從行家中央儲存庫中使用在此示例中:如何修改電話號碼的HAPI驗證規則?

<!-- provides HAPI library --> 
<dependency> 
    <groupId>ca.uhn.hapi</groupId> 
    <artifactId>hapi-base</artifactId> 
    <version>2.2</version> 
</dependency> 
<!-- provides HAPI library message version --> 
<dependency> 
    <groupId>ca.uhn.hapi</groupId> 
    <artifactId>hapi-structures-v22</artifactId> 
    <version>2.2</version> 
</dependency> 

<!-- provides ByteString --> 
<dependency> 
    <groupId>com.typesafe.akka</groupId> 
    <artifactId>akka-actor_2.10</artifactId> 
    <version>2.3.3</version> 
</dependency> 

這裏是我的解析代碼,寫在階的例子:

import akka.util.ByteString 
    import ca.uhn.hl7v2.model.Message 
    import ca.uhn.hl7v2.model.v22.datatype.{CM_PAT_ID, ST, TN, TSComponentOne} 
    import ca.uhn.hl7v2.model.v22.segment.{EVN, MRG, PID} 
    import ca.uhn.hl7v2.parser.CanonicalModelClassFactory 
    import ca.uhn.hl7v2.{DefaultHapiContext, ErrorCode, HL7Exception} 

    lazy val parser = { 
    val context = new DefaultHapiContext() 
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2")) 
    context.getGenericParser 
    } 

    def parseHL7Message(message: ByteString) = Try[Message] { 
    val msg: String = message.utf8String.trim 
    parser.parse(msg) 
    } 

此代碼可以成功地解析遵循HL7消息。

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" + 
"EVN|A31|201410280930\r" + 
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890\r" + 
"PV1\r" 

但是,當在消息中提供帶擴展名的電話號碼時,hapi解析器無法解析消息。這裏是我試圖用的電話號碼的擴展來解析輸入消息的示例:

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" + 
"EVN|A31|201410280930\r" + 
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890 1\r" + 
"PV1\r" 

試圖解析此消息失敗,出現以下錯誤信息:

ca.uhn。 hl7v2.validation.ValidationException:驗證失敗: 原始值「(123)456-7890 1」需要爲空或PID-13

我讀到的一切在美國的電話號碼 我能找到http://hl7api.sourceforge.net/index.html查找有關如何修改驗證規則的文檔,但沒有找到任何有用的信息。

一個例子將是最受讚賞的,但即使指向正確的文檔,或一個簡單的工作示例項目就足夠了。

如何將HAPI解析器使用的驗證規則配置爲允許將電話號碼分機包含在PID-13字段中的有效美國電話號碼中?

編輯

有了多一點的搜索,通過這種高致病性禽流感開發者郵件列表thread,我想通了如何禁用驗證。這裏是一個例子:

lazy val parser = { 
    val context = new DefaultHapiContext() 
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2")) 
    context.setValidationContext(new NoValidation) 
    context.getGenericParser 
    } 

但如果可能,我想繼續驗證消息。如果我必須禁用驗證,我想這將不得不起作用,但我更願意指定驗證保持打開狀態,但該電話號碼可以包含擴展名。

回答

3

我必須使用第三方服務,並且此服務會向我發送無效手機。不幸的是,我不明白,如何做到「最佳實踐」。但我發現一個黑客:

@PostConstruct 
public void postConstruct() { 
    List<RuleBinding<PrimitiveTypeRule>> rules = ((ValidationContextImpl)applicationRouter.getParser().getHapiContext().getValidationContext()).getPrimitiveRuleBindings(); 
    //initially was published with this line, but think it was mistake 
    //for(int i = rules.size() - 1; i > 0; i--) { 
    for(int i = rules.size() - 1; i >= 0; i--) { 
     RuleBinding<PrimitiveTypeRule> item = rules.get(i); 
     if("TN".equals(item.getScope())){ 
      rules.remove(i); 
     } 
    } 
} 

如果有人知道解決方法的詳細好的辦法,請寫信。

2

電話號碼可以包括擴展名。問題是您的擴展名格式不正確。請參閱HL7 Messaging Standard Version 2.2,第2.8.10.9節。電話號碼必須採用以下格式。

[NN] [(999)]999-9999[X99999][B99999][C any text] 

將該擴展名放在'X'後面。

+0

雖然這個答案很好,有信息。我們無權更改擴展程序。 HL7消息被髮送給第三方使用。 – axiopisty 2016-07-26 15:14:22

+0

如果發送應用程序有缺陷,那麼您將不得不編寫自定義代碼來清理不良數據。 HAPI無法爲您解決這個問題。 – 2016-07-26 15:25:15

+0

同意。但是,我們的應用程序不是這些數據的真實來源。雖然HAPI沒有解決問題的責任,但如果HAPI能夠與不良球員打好交手,那將是一件好事。我只是好奇,是否可以爲這種情況啓用自定義驗證,即使它不是有效的HL7消息格式。 – axiopisty 2016-07-27 15:16:09