Hi,
We're developing a FHIR-based solution for a Belgian governmental institution.
We're trying to slice an element using its type as discriminator (we need a different mapping depending on the type), but we're not sure if we're doing it correctly.
Here's the relevant part of the structure definition:
<element id="Patient.deceased[x]">
<path value="Patient.deceased[x]" />
<slicing>
<discriminator>
<type value="type" />
<path value="$this" />
</discriminator>
<rules value="open" />
</slicing>
</element>
<element id="Patient.deceased[x]:deceasedBoolean">
<path value="Patient.deceased[x]" />
<sliceName value="deceasedBoolean" />
<type>
<code value="boolean" />
</type>
<mapping>
<identity value="ctm" />
<language value="Patient.deceasedBoolean" />
<map value="DEC" />
</mapping>
</element>
<element id="Patient.deceased[x]:deceasedDateTime">
<path value="Patient.deceased[x]" />
<sliceName value="deceasedDateTime" />
<type>
<code value="dateTime" />
</type>
<mapping>
<identity value="ctm" />
<language value="Patient.deceasedDateTime" />
<map value="DOD" />
</mapping>
</element>
and here's an example resource:
{
"resourceType": "Patient",
"meta": {
...
},
"id": "...",
"identifier": [
...
],
"gender": "male",
"birthDate": "2000-01-01",
"deceasedDateTime": "2000-01-02",
"address": [
...
]
}
Hapi 3.6.0 throws a NullPointerException:
java.lang.NullPointerException: null
at org.hl7.fhir.r4.utils.FHIRPathEngine.tailMatches(FHIRPathEngine.java:3755) ~[hapi-fhir-structures-r4-3.6.0.jar:na]
at org.hl7.fhir.r4.utils.FHIRPathEngine.evaluateDefinition(FHIRPathEngine.java:3683) ~[hapi-fhir-structures-r4-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.getCriteriaForDiscriminator(InstanceValidator.java:1935) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.sliceMatches(InstanceValidator.java:2411) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateElement(InstanceValidator.java:3374) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.start(InstanceValidator.java:2580) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateResource(InstanceValidator.java:3840) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateContains(InstanceValidator.java:3277) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateElement(InstanceValidator.java:3591) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.start(InstanceValidator.java:2580) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateResource(InstanceValidator.java:3840) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:653) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:606) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:590) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validate(FhirInstanceValidator.java:309) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validate(FhirInstanceValidator.java:335) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.BaseValidatorBridge.doValidate(BaseValidatorBridge.java:20) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.BaseValidatorBridge.validateResource(BaseValidatorBridge.java:43) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validateResource(FhirInstanceValidator.java:51) ~[hapi-fhir-validation-3.6.0.jar:na]
at ca.uhn.fhir.validation.FhirValidator.validateWithResult(FhirValidator.java:235) ~[hapi-fhir-base-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.doValidate(RequestValidatingInterceptor.java:67) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.doValidate(RequestValidatingInterceptor.java:48) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.BaseValidatingInterceptor.validate(BaseValidatingInterceptor.java:292) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.incomingRequestPostProcessed(RequestValidatingInterceptor.java:86) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:955) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:341) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1548) ~[hapi-fhir-server-3.6.0.jar:na]
and HAPI 3.7.0 throws a DefinitionException "Unable to resolve discriminator".
In both cases FHIRPathEngine.evaluateDefinition() seems to fetch "
http://hl7.org/fhir/StructureDefinition/boolean" as the structure definition for element "Patient.deceased[x]:deceasedBoolean" and then tries and fails to find a child definition which ends with "$this".
Any help or pointers would be greatly appreciated.