目录
今天使用Hapi解析一个hl7v2并尝试转为xml格式时碰到了这样的错误
Exception in thread "main" ca.uhn.hl7v2.HL7Exception: Can't XML-encode a GenericMessage. Message must have a recognized structure.
at ca.uhn.hl7v2.parser.XMLParser.doEncode(XMLParser.java:237)
at ca.uhn.hl7v2.parser.Parser.encode(Parser.java:276)
at com.cr.hesb.hl7v2.HL7Helper.hl72xml(HL7Helper.java:164)
at com.cr.hesb.hl7v2.HL7Helper.main(HL7Helper.java:25)
百度了个半天,毫无收获,只能跑去看源码了。
一、示例代码
public static String hl72xml() throws HL7Exception {
String message = "MSH|^~\\&|UMC||ZZJ||20220105101052||ADT^A01^ADT^A01|a8f662b8-6e7a|P|2.6^^&&&&D56D2C42401AAC6F36&&V1.0|||NE|AL||utf-8\n" +
"EVN|REG|20220121235249|||01970836\n" +
"PID||201532012|6521011986122213xx^^^^01||马x明^^^MA ZHI MING||19861222000000|1|||&华容文化路 179 号^华容^岳阳^湖南|||||^^2|||652101198612221332|||^汉族^1||||||86^中国\n" +
"PV1||1|311403^126^^&H002^^^^^^儿科急诊\\T\\急诊科\\T\\专科代码||123||08311056\\S\\朱X峰|||2||||2|2|3|1056\\S\\朱熙峰||1||||||||||||||||||||H0002|0||||20220105100100||||||03-01970836-100^123456^124512^1&4513&2412^^&9:00\\R\\12:00|0|0^1123&20220105100100&245\\S\\张小^^^^\n" +
"IN1|1|A|自费";
HapiContext context = new DefaultHapiContext();
GenericParser normalParse = new GenericParser();
normalParse.getParserConfiguration().setValidating(false);
Message hapiMessage = normalParse.parse(message);
Parser xmlParser = context.getXMLParser();
return xmlParser.encode(hapiMessage);
}
二、发现报错的地方
三、为什么会进入报错判断呢?
直接来到 ca.uhn.hl7v2.parser.PipeParser 下的getStructure(String message)方法
1.如下图所示,先获取hl7v2到实现类的那一栏数据。
2.根据获取的数据分割成数组
2.1.若数组长度大于或等于3则直接使用数组的下标为2的数据
2.2.若数组长度小于或等于0&&或为ACK,则直接赋值为ACK
2.3.若数组长度等于2则将两个数据用“_”进行拼接
3.最后根据变量messageStructure的值去找寻对应的Message实现类,若为空则使用GenericMessage类进行实现
四、总结
原因:
所以报错是因为XMLParser.doEncode(Message source)方法不可将实现类为 GenericMessage的转化为xml格式
解决方法:
1.更改数据的messageStructure值(hl7v2实现类的那一栏数据),使其找到对应的实体。
2.继承抽象类AbstractMessage,重写一个对应的实体!