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

Validation 如何修改电话号码的HAPI验证规则?,validation,hl7,hapi,Validation,Hl7,Hapi,在本例中,maven中央存储库使用了以下依赖项: <!-- provides HAPI library --> <dependency> <groupId>ca.uhn.hapi</groupId> <artifactId>hapi-base</artifactId> <version>2.2</version> </dependency> <!-- provides H

在本例中,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>
此代码可以成功解析以下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处的数字

我阅读了所有我能找到的关于如何修改验证规则的文档,但没有发现任何有用的东西

一个例子是最好的,但即使指向适当的文档,或一个简单的工作示例项目也足够了

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

编辑

通过这个hapi开发人员邮件列表,再进行一些搜索,我发现了如何完全禁用验证。以下是一个例子:

  lazy val parser = {
    val context = new DefaultHapiContext()
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2"))
    context.setValidationContext(new NoValidation)
    context.getGenericParser
  }
但是如果可能的话,我想继续验证消息。如果我必须禁用验证,我想这必须起作用,但我更愿意指定验证保持打开状态,但电话号码可以包括分机。

电话号码可以包括分机。问题是您的扩展名格式错误。见第2.8.10.9节。电话号码必须采用以下格式

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

将分机放在“X”之后。

我必须使用第三方服务,该服务会向我发送无效电话。不幸的是,我不明白如何把它作为“最佳实践”。但我发现了一个黑客:

@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);
        }
    }
}
@PostConstruct
public void postConstruct(){
列表规则=((ValidationContextImpl)applicationRouter.getParser().getHapiContext().getValidationContext()).getPrimitiveRuleBindings();
//最初是用这句话发表的,但我认为这是错误的
//对于(int i=rules.size()-1;i>0;i--){
对于(int i=rules.size()-1;i>=0;i--){
RuleBinding项=rules.get(i);
如果(“TN”.equals(item.getScope())){
规则.删除第(i)款;
}
}
}

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

这个答案很好,因为有信息。我们没有权限更改扩展名。HL7消息被发送给第三方使用。如果发送应用程序有缺陷,则您必须编写自定义代码来清理坏数据。HAPI无法解决此问题你同意。但是,我们的应用程序并不是这些数据的真实来源。虽然解决这个问题不是HAPI的责任,但如果HAPI能很好地与坏玩家合作,那就太好了。我只是好奇,即使不是有效的HL7消息格式,是否有可能对此场景启用自定义验证。
@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);
        }
    }
}