org.hl7.fhir.dstu3.model.Объект ресурса параметров не будет увлажняться / заполняться при расширенной операции

#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

http://hl7.org/fhir/STU3/patient-example.json

и это работает нормально.

 {
    "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