Условные ссылки в HAPI FHIR
HL7 FHIR Release 3 (STU) представил концепцию условных ссылок в пакетах транзакций:
При создании пакета клиент может не знать логический идентификатор ресурса, но он может знать идентификационную информацию - например, идентификатор. Эта ситуация обычно возникает при построении транзакций из сообщений v2. Клиент может разрешить этот идентификатор в логический идентификатор с помощью поиска, но это будет означать, что преобразование в логический идентификатор не происходит в той же транзакции, что и фиксация (а также значительно усложняет клиента). Из-за этого в транзакции (и только в транзакции) ссылки на ресурсы могут быть заменены поисковым URI, который описывает, как найти правильную ссылку:
<Bundle xmlns="http://hl7.org/fhir">
<id value="20160113160203" />
<type value="transaction" />
<entry>
<fullUrl value="urn:uuid:c72aa430-2ddc-456e-7a09-dea8264671d8" />
<resource>
<Observation>
<subject>
<reference value="Patient?identifier=12345" />
</subject>
<!-- rest of resource omitted -->
</Observation>
</resource>
<request>
<method value="POST" />
</request>
</entry>
</Bundle>
URI поиска относится к [базовому] пути сервера и всегда начинается с типа ресурса:
[type]:?parameters....
Разрешены только параметры фильтрации; ни один из параметров, управляющих возвратом ресурсов, не имеет значения.При обработке транзакций серверы ДОЛЖНЫ:
- проверить все ссылки для поиска URI
- Для поиска URI используйте поиск, чтобы найти соответствующие ресурсы
- если совпадений нет или несколько совпадений, транзакция завершается неудачно и пользователю возвращается ошибка
- если есть одно совпадение, сервер заменяет поисковый URI ссылкой на соответствующий ресурс
... цитируется с 2.21.0.17.2 Правила обработки транзакций
Я нашел эту концепцию условных ссылок очень полезной, и я хотел бы использовать ее в своем клиент-серверном приложении HAPI FHIR. Кажется, это не поддерживается. Такой пакет транзакций был отклонен сервером со следующими сообщениями об ошибках:
Клиент:
HTTP 400 Bad Request: недопустимая ссылка на ресурс найдена в
path[Observation.subject]
- Не содержит тип ресурса -Patient?identifier=12345
Exception in thread "main" ca.uhn.fhir.rest.server.exceptions.InvalidRequestException: HTTP 400 Bad Request: Invalid resource reference found at path[Observation.subject] - Does not contain resource type - Patient?identifier=12345
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException.newInstance(BaseServerResponseException.java:307)
at ca.uhn.fhir.rest.client.BaseClient.invokeClient(BaseClient.java:290)
at ca.uhn.fhir.rest.client.GenericClient$BaseClientExecutable.invoke(GenericClient.java:637)
at ca.uhn.fhir.rest.client.GenericClient$TransactionExecutable.execute(GenericClient.java:2209)
Журнал сервера:
WARN cufrsiExceptionHandlingInterceptor [ExceptionHandlingInterceptor.java:135] Ошибка при обработке REST: ca.uhn.fhir.rest.server.exceptions.InvalidRequestException: недопустимая ссылка на ресурс, найденная в
path[Observation.subject]
- Не содержит тип ресурса -Patient?identifier=12345
Итак, мой вопрос:
Можно ли использовать условные ссылки с сервером HAPI FHIR JPA?
Или, если это невозможно, есть ли обход? Могу ли я использовать ту же условную операцию, которая разрешит ссылку или потерпит неудачу, если цель ссылки не существует?
1 ответ
Наконец я обнаружил, что это возможно даже с HAPI FHIR vesion 2.2
просто добавив следующую опцию на сервер DaoConfig
:
ca.uhn.fhir.jpa.dao.DaoConfig.setAllowInlineMatchUrlReferences(true)
Если ссылки, содержащие совпадающие URL-адреса, будут разрешены и заменены в операциях создания и обновления. Например, если для этого свойства установлено значение true и создан ресурс, содержащий ссылку на
Patient?identifier=12345
, этот URL-адрес совпадения будет разрешен и заменен в соответствии с обычными правилами соответствия URL-адресов.По умолчанию
false
на данный момент, так как это экспериментальная функция.
Посмотрите исходный код здесь: github.com/jamesagnew/hapi-fhir