我有一个应用程序,当前使用带有自定义消息类型和Z段类的自定义模型。例如,我在v25包中有一个DFT_P03类,该类扩展AbstractMessage并声明段,也位于同一包中,例如:
private void init(ModelClassFactory factory)
{
try
{
this.add(MSH.class, true, false);
this.add(PID.class, false, false);
this.add(PV1.class, false, false);
this.add(FT1.class, false, false);
this.add(ZPM.class, false, false);
}
catch (HL7Exception e)
{}
}
这就是我创建HapiContext的方式,该指向相同的包:
public void initializeHAPI()
{
try
{
ModelClassFactory cmf = new CustomModelClassFactory("com.somepackage.somelibraryname.hl7.custommodel");
MinLowerLayerProtocol mllp = new MinLowerLayerProtocol();
mllp.setCharset(StandardCharsets.ISO_8859_1.name());
hapiContext = new DefaultHapiContext();
hapiContext.setValidationContext(ValidationContextFactory.noValidation());
hapiContext.getPipeParser().getParserConfiguration().setUnexpectedSegmentBehaviour(UnexpectedSegmentBehaviourEnum.ADD_INLINE);
hapiContext.setModelClassFactory(cmf);
hapiContext.setLowerLayerProtocol(mllp);
logEntryService.logInfo(LogEntrySource.SERVICE, LogEntryType.CORE, "Successfully initialized HAPI framework", logger);
}
catch (Exception ex)
{
logEntryService.logError(LogEntrySource.SERVICE, LogEntryType.CORE, "Error initializing HAPI framework : "
+ ex.getMessage(), logger);
}
}
只要我在MSH.12中使用2.5发送消息,一切都会正常进行。我想将CanonicalModelClassFactory集成到此中,以便当我尝试将消息解析为v2.5 DFT_P03类时,可以将较低版本解析为v2.5消息而不会引发ClassCastException。我已经阅读了所有可以找到的信息,但是不幸的是,没有一个信息与CustomModelClassFactory结合使用。
我实际上创建了自己的CustomModelClassFactory类,该类扩展了CanonicalClassModelFactory并修改了构造函数链:
public CustomModelClassFactory()
{
this((Map<String, String[]>)null);
}
public CustomModelClassFactory(String packageName)
{
this(new HashMap<String, String[]>());
if (!packageName.endsWith("."))
{
packageName += ".";
}
for (Version v : Version.values())
{
addModel(v.getVersion(), new String[] {packageName + v.getPackageVersion()});
}
}
public CustomModelClassFactory(Map<String, String[]> map)
{
this(new CanonicalModelClassFactory("2.5"), map);
}
public CustomModelClassFactory(ModelClassFactory defaultFactory, Map<String, String[]> map)
{
super("2.5");
this.delegate = defaultFactory;
customModelClasses = map;
}
请注意,将委托模型设置为CanonicalModelClassFactory和super(“ 2.5”)调用。可悲的是,当尝试解析v2.5 DFT消息以外的其他内容时,仍然会引发ClassCastException。
关于如何将这两种行为整合在一起的任何想法?
谢谢!
答案 0 :(得分:1)
我们找到了一种结合这两种行为的方法。
public class CustomModelCanonicalClassFactory extends CustomModelClassFactory {
private String customVersion;
public CustomModelCanonicalClassFactory(String packageName, String version){
super(packageName);
if (version == null || !Version.supportsVersion(version)) {
throw new IllegalArgumentException("Unknown version: " + version);
}
this.customVersion = version;
}
}
然后覆盖您需要的所有方法,为super#method
提供显式版本
@Override
public Class<? extends Message> getMessageClass(String name, String version, boolean isExplicit) throws HL7Exception {
return super.getMessageClass(name, this.customVersion, isExplicit);
}
@Override
public Class<? extends Group> getGroupClass(String name, String version) throws HL7Exception {
return super.getGroupClass(name, this.customVersion);
}
最好的问候, 帕特里克