Skip to content

failed to search resource which has contained resources when partitioning is enabled #4548

Open
@dannyyyyS

Description

@dannyyyyS

Describe the bug
ClassCastException throws when searching resource if the resource has "contained" resources. This issue only happens when partitioning is enabled and it's a SEARCH action. Service handle request successfully if using READ action like "fhir/DEFAULT/ServiceRequest/2"

error stack:

java.lang.ClassCastException: class org.hl7.fhir.r5.model.Specimen cannot be cast to class org.hl7.fhir.r4b.model.Resource (org.hl7.fhir.r5.model.Specimen and org.hl7.fhir.r4b.model.Resource are in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @5e9f23b4)
	at org.hl7.fhir.r4b.hapi.rest.server.R4BBundleFactory.addResourcesToBundle(R4BBundleFactory.java:83)
	at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.createBundleFromBundleProvider(BaseResourceReturningMethodBinding.java:306)
	at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:386)
	at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:430)
	at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1167)
	at ca.uhn.fhir.rest.server.RestfulServer.doGet(RestfulServer.java:416)
	at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1870)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:67)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:833)
2023-02-14 11:51:20.019 [http-nio-8080-exec-4] INFO  fhirtest.access [LoggingInterceptor.java:160] ERROR - GET http://192.168.209.130:19999/fhir/DEFAULT/ServiceRequest

To Reproduce
Steps to reproduce the behavior:

  1. enable partitioning
partitioning:
      enabled: true
      allow_references_across_partitions: true
      partitioning_include_in_search_hashes: false
  1. create a resource with contained resources on DEFAULT partition
    POST localhost:8080/fhir/DEFAULT
{
    "resourceType": "Bundle",
    "id": "100",
    "type": "transaction",
    "entry": [
      {
        "resource": {
          "resourceType": "Patient",
          "id": "101",
          "active": true,
          "name": [
            {
              "use": "official",
              "text": "Li Si",
              "family": "Li",
              "given": [
                "Si"
              ]
            }
          ],
          "gender": "male",
          "birthDate": "1999-01-01"
        },
        "request": {
          "method": "POST",
          "url": "Patient"
        }
      },
      {
        "resource": {
          "resourceType": "ServiceRequest",
          "status": "active",
          "intent": "order",
          "contained": [
            {
              "resourceType": "Specimen",
              "id": "1",
              "identifier": [
                {
                  "system": "http://example.org/specimen/org1",
                  "value": "BarNo-123"
                }
              ],
              "type": {
                "coding": [
                  {
                    "system": "http://example.org/specimen-type/org1",
                    "code": "01",
                    "display": "Serum"
                  }
                ]
              },
              "collection": {
                "collectedDateTime": "2015-08-16T06:40:17Z"
              }
            },
            {
              "resourceType": "Organization",
              "id": "2",
              "identifier": [
                {
                  "system": "http://example.org/orgs",
                  "value": "org2"
                }
              ],
              "name": "agency-org2"
            }
          ],
          "identifier": [
            {
              "system": "http://example.org/order/org1",
              "value": "order-123"
            }
          ],
          "code": {
            "coding": [
              {
                "system": "http://example.org/panels/org1",
                "code": "LYYP-0094"
              }
            ],
            "text": "CBC auto"
          },
          "subject": {
            "reference": "Patient/101"
          },
          "specimen": [
            {
              "reference": "#1"
            }
          ],
          "performer": [
            {
              "reference": "#2"
            }
          ]
        },
        "request": {
          "method": "POST",
          "url": "ServiceRequest"
        }
      }
    ]
  }
  1. search resource that created before
    GET localhost:8080/fhir/DEFAULT/ServiceRequest
  2. See error

Expected behavior
return resource like "partitioning-disable" does

Screenshots

Environment (please complete the following information):

  • HAPI FHIR Version: v6.2.5
  • OS: Docker Image
  • Postman

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions