在此示例中,使用了来自 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:验证失败:原始值“(123)456-7890 1”需要为空或PID-13的美国电话号码
我阅读了在http://hl7api.sourceforge.net/index.html上可以找到的所有内容,以查找有关如何修改验证规则的文档,但没有发现任何有用的信息。
一个例子会很受欢迎,但即使指向正确的文档,或者一个简单的工作示例项目就足够了。
如何将 HAPI 解析器使用的验证规则配置为允许电话号码扩展包含在 PID-13 字段中的有效美国电话号码中?
编辑
通过这个 hapi developer mailing list thread进行更多搜索,我想出了如何完全禁用验证。这是一个例子:
lazy val parser = {
val context = new DefaultHapiContext()
context.setModelClassFactory(new CanonicalModelClassFactory("2.2"))
context.setValidationContext(new NoValidation)
context.getGenericParser
}
但如果可能的话,我想继续验证这些消息。如果我必须禁用验证,我想这将不得不工作,但我更愿意指定验证保持打开状态,但电话号码可以包含扩展名。