validation - 如何修改电话号码的HAPI验证规则?

标签 validation hl7 hapi

本示例中使用了 Maven 中央存储库中的以下依赖项:

<!-- 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>

这是我用 scala 编写的解析代码的示例:

  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: Validation failed: Primitive value '(123)456-7890 1' requires to be empty or a US phone number at PID-13

我阅读了在 http://hl7api.sourceforge.net/index.html 上能找到的所有内容,以查找有关如何修改验证规则的文档,但没有找到任何有用的内容。

最好提供一个示例,但即使指向正确的文档或一个简单的工作示例项目就足够了。

如何配置 HAPI 解析器使用的验证规则以允许电话号码分机包含在 PID-13 字段的有效美国电话号码中?

编辑

通过这个 hapi 开发者邮件列表 thread 进行更多搜索,我找到了如何完全禁用验证的方法。这是一个例子:

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

但如果可能的话,我想继续验证这些消息。如果我必须禁用验证,我想这必须起作用,但我更愿意指定验证保持打开状态,但电话号码可以包含分机号。

最佳答案

我必须与第三方服务合作,而该服务向我发送无效电话。不幸的是,我不明白如何将其作为“最佳实践”。但我发现了一个技巧:

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

如果有人知道更好的解决方法,请写信。

关于validation - 如何修改电话号码的HAPI验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682780/

相关文章:

javascript - Jquery 表单验证

xml - 如何从单个 HL7 文件生成两个 XML 文件并将它们作为单个记录插入到两个不同的列中?

c# - Nhapi 解析问题

dicom - 如何使用 HL7 消息在 DCM4CHE 中为患者创建模态工作列表?

java - 在 Pentaho Data Integration KETTLE 中迭代重复的特定 HL7 段

java - 从 HAPI FHIR 中创建操作的 MethodOutcome/结果中提取 HTTP 状态代码

asp.net-mvc - 在ASP.NET MVC框架中验证发布的表单数据

c# - 模型验证 ASP.NET Core MVC 的自定义错误消息

python - Django:构造表单而不验证字段?