#hl7-fhir #hapi-fhir
#hl7-fhir #hapi-fhir
Вопрос:
У меня есть пользовательский IResourceProvider, который обслуживает измерение (Measure.class ).
В этом коде у меня есть следующая расширенная операция. (из http://hapifhir.io/doc_rest_operations.html#_toc_extended_operations )
@Operation(name = "$humptydumpty")
public org.hl7.fhir.dstu3.model.Bundle acceptHumptyDumpty(HttpServletRequest servletRequest,
@IdParam(optional = true) IdType theId,
@OperationParam(name = "request") org.hl7.fhir.dstu3.model.Measure item) {
String fakeMessage;
if (null == item) {
fakeMessage = "org.hl7.fhir.dstu3.model.Measure item is null. Sad face. :( ";
} else {
fakeMessage = "org.hl7.fhir.dstu3.model.Measure item is not null. Happy face. :) ";
}
Bundle retVal = new Bundle();
retVal.setId(fakeMessage);
return retVal;
}
Если я передам пример JSON из
http://hl7.org/fhir/STU3/measure-exclusive-breastfeeding.json.html
Публикация
http://localhost:8080/fhir/Measure/MyMeasureName123 /$humptydumpty
Все работает нормально. Я возвращаюсь.
{
"resourceType": "Bundle",
"id": "org.hl7.fhir.dstu3.model.Measure item is not null. Happy face. :) "
}
Итак, я понимаю основы того, как работает $ myExtendedMethod.
ТЕПЕРЬ, когда я пытаюсь сделать то же самое для .Parameters….
Java-код (тот же MyResourceProvider, что и выше)
@Operation(name = "$robinhood")
public Bundle acceptRobinHood(HttpServletRequest servletRequest,
@IdParam(optional = true) IdType theId,
@OperationParam(name = "request") org.hl7.fhir.dstu3.model.Parameters item) {
String fakeMessage;
if (null == item) {
fakeMessage = "org.hl7.fhir.dstu3.model.Parameters item is null. Sad face. :( ";
} else {
fakeMessage = "org.hl7.fhir.dstu3.model.Parameters item is not null. Happy face. :) ";
}
Bundle retVal = new Bundle();
retVal.setId(fakeMessage);
return retVal;
}
Публикация
http://localhost:8080/fhir/Measure/MyMeasureName123 /$robinhood
Я отправил «пример» от http://hl7.org/fhir/STU3/parameters-example.json .
{
"resourceType": "Parameters",
"id": "example",
"parameter": [
{
"name": "start",
"valueDate": "2010-01-01"
},
{
"name": "end",
"resource": {
"resourceType": "Binary",
"contentType": "text/plain",
"content": "VGhpcyBpcyBhIHRlc3QgZXhhbXBsZQ=="
}
}
]
}
And if I send in … the most basic json.
{
"resourceType": "Parameters",
"id": "MyParameterId234"
}
I get the sad face. 🙁
I’ve tried everything.
The «item» is always null. Aka, I get this back.
{
"resourceType": "Bundle",
"id": "org.hl7.fhir.dstu3.model.Parameters item is null. Sad face. :( "
}
I’ve tried many things, and finally went back to the «.Measure» just to prove I wasn’t crazy.
But I cannot figure why one will populate (.Measure resource), and the other (.Parameters) will not. #help
My hapi fhir version:
<properties>
<hapi.version>3.6.0</hapi.version>
</properties>
<!-- FHIR dependencies -->
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-dstu3</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-server</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-base</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-validation-resources-dstu3</artifactId>
<version>${hapi.version}</version>
</dependency>
APPEND:
I did one for patient
@Operation(name = "$teddybear")
public org.hl7.fhir.dstu3.model.Bundle acceptTeddyBear(HttpServletRequest servletRequest,
@IdParam(optional = true) IdType theId,
@OperationParam(name = "request") org.hl7.fhir.dstu3.model.Patient item) {
String fakeMessage;
if (null == item) {
fakeMessage = "org.hl7.fhir.dstu3.model.Patient item is null. Sad face. :( ";
} else {
fakeMessage = "org.hl7.fhir.dstu3.model.Patient item is not null. Happy face. :) ";
}
Bundle retVal = new Bundle();
retVal.setId(fakeMessage);
return retVal;
}
Публикация
http://localhost:8080/fhir/Measure/MyMeasureName123 /$teddybear
и это работает нормально.
{
"resourceType": "Bundle",
"id": "org.hl7.fhir.dstu3.model.Patient item is not null. Happy face. :) "
}
Это только .Ресурс параметров, который причиняет мне боль.
ДОБАВИТЬ
В соответствии с ответом Джеймса А и подсказкой по обходу, которую я привел ниже.
Обходной код: (он же «ОТВЕТ» в смысле обходного ответа)
@Operation(name = "$robinhood")
public Bundle acceptRobinHood(HttpServletRequest servletRequest,
@IdParam(optional = true) IdType theId,
/*@OperationParam(name = "request") org.hl7.fhir.dstu3.model.Parameters item*/ @ResourceParam String theRawBody) {
String fakeMessage;
if (null == theRawBody || StringUtils.isBlank(theRawBody)) {
fakeMessage = "theRawBody is null or isBlank. Sad face. :( ";
} else {
fakeMessage = "theRawBody is not null and is not isBlank. Happy face. :) ";
}
org.hl7.fhir.dstu3.model.Parameters paramsObject = null;
FhirContext ctx = FhirContext.forDstu3();// this.getContext(); /* prefer encapsulated over hard coding, but for SOF, put in the hard code */
IParser parser = ctx.newJsonParser();
IBaseResource res = parser.parseResource(theRawBody);
paramsObject = (org.hl7.fhir.dstu3.model.Parameters) res;
if (null != paramsObject) {
fakeMessage = " org.hl7.fhir.dstu3.model.Parameters was serialized from theRawBody. Super Happy face. :) :)";
}
else
{
fakeMessage = " org.hl7.fhir.dstu3.model.Parameters was NOT serialized from theRawBody (is null). Super Sad face. :( :( ";
}
Bundle retVal = new Bundle();
retVal.setId(fakeMessage);
return retVal;
}
и ответ от выполнения кода:
{
"resourceType": "Bundle",
"id": "theRawBody is not null and is not isBlank. Happy face. :) org.hl7.fhir.dstu3.model.Parameters was serialized from theRawBody. Super Happy face. :) :)"
}
Ответ №1:
Честно говоря, это выглядит как ошибка в HAPI FHIR. Если бы вы хотели сообщить об этом на трекере GitHub, это было бы здорово.
Вероятно, вы могли бы обойти это, добавив параметр в соответствии с:
@ResourceParam Строковый код для преобразования
И использование анализатора HAPI FHIR для анализа ресурса параметров. Это, конечно, раздражает, но я верю, что это сработает.
Комментарии:
1. Я дополнил свой вопрос кодом, который реализует обходной путь. Итак, этот ответ… ответил на мой вопрос. Я сообщу об ошибке. Спасибо за быстрый отзыв, Джеймс.
2. Сделано : github.com/jamesagnew/hapi-fhir/issues/1230 Еще раз спасибо, Джеймс. #notBlockedNow