Условные ссылки в 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

Другие вопросы по тегам