如何用 ZPM 段解析 DFT_P03 消息
How to parse DFT_P03 message with ZPM segment
我正在编写一个服务器应用程序,它将接收 DFT_P03 带有添加的 ZPM 段的消息(我已经根据 HAPI 文档为它创建了 class)。目前,我可以在执行以下操作时将此字段作为通用段访问:
@Override
public Message processMessage(Message t, Map map) throws ReceivingApplicationException, HL7Exception
{
String encodedMessage = new DefaultHapiContext().getPipeParser().encode(t);
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Received message:\n" + encodedMessage + "\n\n");
try
{
InboundMessage inboundMessage = new InboundMessage();
inboundMessage.setMessageTime(new Date());
inboundMessage.setMessageType("Usage");
DFT_P03 usageMessage = (DFT_P03) t;
Segment ZPMSegment = (Segment)usageMessage.get("ZPM");
inboundMessage.setMessage(usageMessage.toString());
Facility facility = facilityService.findByCode(usageMessage.getMSH().getReceivingFacility().getNamespaceID().getValue());
inboundMessage.setTargetFacility(facility);
String controlID = usageMessage.getMSH().getMessageControlID().encode();
controlID = controlID.substring(controlID.indexOf("^") + 1, controlID.length());
inboundMessage.setControlId(controlID);
Message response;
try
{
inboundMessageService.save(inboundMessage);
response = t.generateACK();
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message ACKed");
}
catch (Exception ex)
{
response = t.generateACK(AcknowledgmentCode.AE, new HL7Exception(ex));
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message NACKed");
}
return response;
}
catch (IOException e)
{
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message rejected");
throw new HL7Exception(e);
}
}
我创建了一个 DFT_P03_Custom class,如下所示:
public class DFT_P03_Custom extends DFT_P03
{
public DFT_P03_Custom() throws HL7Exception
{
this(new DefaultModelClassFactory());
}
public DFT_P03_Custom(ModelClassFactory factory) throws HL7Exception
{
super(factory);
String[] segmentNames = getNames();
int indexOfPid = Arrays.asList(segmentNames).indexOf("FT1");
int index = indexOfPid + 1;
Class<ZPM> type = ZPM.class;
boolean required = true;
boolean repeating = false;
this.add(type, required, repeating, index);
}
public ZPM getZPM()
{
return getTyped("ZPM", ZPM.class);
}
}
当尝试将消息类型转换为 DFT_P03_Custom 实例时,我收到 ClassCastException。根据他们的文档,我确实创建了 CustomModelClassFactory class 但是使用它我只是在 controlId 字段上遇到大量验证错误。
我已经在使用相同的逻辑来发送带有添加的 ZFX 段的自定义 MFN_M01 消息,并且可以完美运行。我知道 HAPI 在收到 DFT_P03 消息时会进行一些自动类型转换,这很可能是我需要以某种方式覆盖的内容,以便它能够给我一个 DFT_P03_Custom 实例。
如果您对我如何在不使用通用细分实例的情况下实现这一目标有一些见解,请提供帮助!
谢谢!
我终于明白了。我让它工作的唯一方法是生成一个一致性配置文件 XML 文件(使用来自我们应用程序的示例消息作为基础)和 HAPI 站点上的消息传递 workbench 并使用 maven 插件来生成消息和段 classes。只有使用这些 classes,我才能正确地将消息解析为我的自定义 class。需要注意的一件事是,如果我尝试使用 HAPI 提供的 MSH、PID、PV1 或 FT1 classes 并使用我的 Z 段 class,它就不起作用。它仅在所有段都是由一致性插件生成的 classes 时才有效。这与 CustomModelClassFactory class(如 HAPI 网站所示)和正确的包结构相结合,最终使我能够访问我的 Z 段。
我正在编写一个服务器应用程序,它将接收 DFT_P03 带有添加的 ZPM 段的消息(我已经根据 HAPI 文档为它创建了 class)。目前,我可以在执行以下操作时将此字段作为通用段访问:
@Override
public Message processMessage(Message t, Map map) throws ReceivingApplicationException, HL7Exception
{
String encodedMessage = new DefaultHapiContext().getPipeParser().encode(t);
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Received message:\n" + encodedMessage + "\n\n");
try
{
InboundMessage inboundMessage = new InboundMessage();
inboundMessage.setMessageTime(new Date());
inboundMessage.setMessageType("Usage");
DFT_P03 usageMessage = (DFT_P03) t;
Segment ZPMSegment = (Segment)usageMessage.get("ZPM");
inboundMessage.setMessage(usageMessage.toString());
Facility facility = facilityService.findByCode(usageMessage.getMSH().getReceivingFacility().getNamespaceID().getValue());
inboundMessage.setTargetFacility(facility);
String controlID = usageMessage.getMSH().getMessageControlID().encode();
controlID = controlID.substring(controlID.indexOf("^") + 1, controlID.length());
inboundMessage.setControlId(controlID);
Message response;
try
{
inboundMessageService.save(inboundMessage);
response = t.generateACK();
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message ACKed");
}
catch (Exception ex)
{
response = t.generateACK(AcknowledgmentCode.AE, new HL7Exception(ex));
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message NACKed");
}
return response;
}
catch (IOException e)
{
logEntryService.logDebug(LogEntry.CONNECTIVITY, "Message rejected");
throw new HL7Exception(e);
}
}
我创建了一个 DFT_P03_Custom class,如下所示:
public class DFT_P03_Custom extends DFT_P03
{
public DFT_P03_Custom() throws HL7Exception
{
this(new DefaultModelClassFactory());
}
public DFT_P03_Custom(ModelClassFactory factory) throws HL7Exception
{
super(factory);
String[] segmentNames = getNames();
int indexOfPid = Arrays.asList(segmentNames).indexOf("FT1");
int index = indexOfPid + 1;
Class<ZPM> type = ZPM.class;
boolean required = true;
boolean repeating = false;
this.add(type, required, repeating, index);
}
public ZPM getZPM()
{
return getTyped("ZPM", ZPM.class);
}
}
当尝试将消息类型转换为 DFT_P03_Custom 实例时,我收到 ClassCastException。根据他们的文档,我确实创建了 CustomModelClassFactory class 但是使用它我只是在 controlId 字段上遇到大量验证错误。
我已经在使用相同的逻辑来发送带有添加的 ZFX 段的自定义 MFN_M01 消息,并且可以完美运行。我知道 HAPI 在收到 DFT_P03 消息时会进行一些自动类型转换,这很可能是我需要以某种方式覆盖的内容,以便它能够给我一个 DFT_P03_Custom 实例。
如果您对我如何在不使用通用细分实例的情况下实现这一目标有一些见解,请提供帮助!
谢谢!
我终于明白了。我让它工作的唯一方法是生成一个一致性配置文件 XML 文件(使用来自我们应用程序的示例消息作为基础)和 HAPI 站点上的消息传递 workbench 并使用 maven 插件来生成消息和段 classes。只有使用这些 classes,我才能正确地将消息解析为我的自定义 class。需要注意的一件事是,如果我尝试使用 HAPI 提供的 MSH、PID、PV1 或 FT1 classes 并使用我的 Z 段 class,它就不起作用。它仅在所有段都是由一致性插件生成的 classes 时才有效。这与 CustomModelClassFactory class(如 HAPI 网站所示)和正确的包结构相结合,最终使我能够访问我的 Z 段。