У меня есть приложение, которое в настоящее время использует пользовательскую модель с пользовательскими типами сообщений и классами Z-сегментов. Например, у меня есть класс DFT_P03 в моем пакете v25, который расширяет 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);
}
}
Пока я отправляю сообщения с 2.5 в MSH.12, все работает без нареканий. Я хотел бы интегрировать CanonicalModelClassFactory в это, чтобы он мог анализировать более низкие версии как сообщения v2.5, не вызывая исключение ClassCastException, когда я пытаюсь проанализировать сообщение в моем классе DFT_P03 v2.5. Я прочитал всю информацию, которую смог найти по этому поводу, и, к сожалению, никто из них не использовал ее вместе с 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"). К сожалению, это все еще вызывает исключение ClassCastException при попытке проанализировать что-либо еще, кроме сообщения DFT v2.5.
Есть идеи, как объединить эти два поведения вместе?
Спасибо!