hapi-fhir icon indicating copy to clipboard operation
hapi-fhir copied to clipboard

DiagnosticReport narrative template generation fails when coding isn't present

Open dotasek opened this issue 5 months ago • 0 comments

Describe the bug On the test server https://hapi.fhir.org/, the REST endpoint baseR4/Bundle (https://hapi.fhir.org/baseR4/Bundle) returns an error:

ERROR Exception evaluating OGNL expression: "result.resource.interpretation.coding[0].display" (template: "diagnosticreport" - line 102, col 280)

This is on 2024/09/12; depending on server restarts and Bundle resources, this may change.

The full exception in the server log is as follows:

2024-09-12 13:45:02.939 [qtp263025902-10295] [] [] ERROR c.u.f.r.s.i.ExceptionHandlingInterceptor Failure during REST processing: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "result.resource.interpretation.coding[0].display" (template: "diagnosticreport" - line 102, col 280)
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "result.resource.interpretation.coding[0].display" (template: "diagnosticreport" - line 102, col 280)
        at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:199)
        at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:104)
        at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166)
        at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66)
        at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109)
        at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138)
        at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144)
        at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
        at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95)
        at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633)
        at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918)
        at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228)
        at org.thymeleaf.engine.Model.process(Model.java:282)
        at org.thymeleaf.engine.Model.process(Model.java:290)
        at org.thymeleaf.engine.IteratedGatheringModelProcessable.processIterationModel(IteratedGatheringModelProcessable.java:368)
        at org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:222)
        at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640)
        at org.thymeleaf.engine.CloseElementTag.beHandled(CloseElementTag.java:139)
        at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136)
        at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:661)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1103)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1064)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1053)
        at ca.uhn.fhir.narrative.BaseThymeleafNarrativeGenerator.applyTemplate(BaseThymeleafNarrativeGenerator.java:117)
        at ca.uhn.fhir.narrative2.BaseNarrativeGenerator.applyTemplate(BaseNarrativeGenerator.java:113)
        at ca.uhn.fhir.narrative2.BaseNarrativeGenerator.populateResourceNarrative(BaseNarrativeGenerator.java:51)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementChildrenToStreamWriter(JsonParser.java:498)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementToStreamWriter(JsonParser.java:816)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:939)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:870)
        at ca.uhn.fhir.parser.JsonParser.encodeChildElementToStreamWriter(JsonParser.java:431)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementChildrenToStreamWriter(JsonParser.java:677)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementToStreamWriter(JsonParser.java:816)
        at ca.uhn.fhir.parser.JsonParser.encodeChildElementToStreamWriter(JsonParser.java:374)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementChildrenToStreamWriter(JsonParser.java:691)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementToStreamWriter(JsonParser.java:816)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:939)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:870)
        at ca.uhn.fhir.parser.JsonParser.encodeChildElementToStreamWriter(JsonParser.java:431)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementChildrenToStreamWriter(JsonParser.java:677)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementToStreamWriter(JsonParser.java:816)
        at ca.uhn.fhir.parser.JsonParser.encodeChildElementToStreamWriter(JsonParser.java:374)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementChildrenToStreamWriter(JsonParser.java:665)
        at ca.uhn.fhir.parser.JsonParser.encodeCompositeElementToStreamWriter(JsonParser.java:816)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:939)
        at ca.uhn.fhir.parser.JsonParser.encodeResourceToJsonStreamWriter(JsonParser.java:870)
        at ca.uhn.fhir.parser.JsonParser.doEncodeResourceToJsonLikeWriter(JsonParser.java:215)
        at ca.uhn.fhir.parser.JsonParser.doEncodeResourceToWriter(JsonParser.java:223)
        at ca.uhn.fhir.parser.BaseParser.encodeResourceToWriter(BaseParser.java:345)
        at ca.uhn.fhir.parser.BaseParser.encodeResourceToWriter(BaseParser.java:302)
        at ca.uhn.fhir.parser.BaseParser.encodeResourceToString(BaseParser.java:290)
        at ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor.streamResponse(ResponseHighlighterInterceptor.java:656)
        at ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor.handleOutgoingResponse(ResponseHighlighterInterceptor.java:588)
        at ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor.outgoingResponse(ResponseHighlighterInterceptor.java:464)
        at jdk.internal.reflect.GeneratedMethodAccessor154.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at ca.uhn.fhir.interceptor.executor.BaseInterceptorService$HookInvoker.invokeMethod(BaseInterceptorService.java:582)
        at ca.uhn.fhir.interceptor.executor.BaseInterceptorService$HookInvoker.invoke(BaseInterceptorService.java:552)
        at ca.uhn.fhir.interceptor.executor.BaseInterceptorService.doCallHooks(BaseInterceptorService.java:289)
        at ca.uhn.fhir.interceptor.executor.BaseInterceptorService.callHooks(BaseInterceptorService.java:277)
        at ca.uhn.fhir.interceptor.executor.BaseInterceptorService.callHooks(BaseInterceptorService.java:65)
        at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.callOutgoingResponseHook(BaseResourceReturningMethodBinding.java:349)
        at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:290)
        at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1198)
        at ca.uhn.fhir.rest.server.RestfulServer.doGet(RestfulServer.java:424)
        at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1938)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
        at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1370)
        at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
        at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614)
        at org.eclipse.jetty.ee10.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:195)
        at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:205)
        at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1586)
        at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547)
        at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:819)
        at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:431)
        at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
        at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:703)
        at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:851)
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:151)
        at org.eclipse.jetty.server.Server.handle(Server.java:179)
        at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:619)
        at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:411)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
        at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: ognl.NoSuchPropertyException: java.util.ArrayList.coding

To Reproduce

Currently (2024/09/12) occurring on the test server listed above. Since the log trace does not indicate which bundle resource is causing the issue, it is difficult to create a simple reproduction. However, to start, this appears to be the template in question:

https://github.com/hapifhir/hapi-fhir/blob/ab2ba05fb595ee0823c407c61b3a301670991a92/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/DiagnosticReport.html#L86

From the error, I would check to see if a bundle containing a DiagnosticReport with a missing coding causes an error.

Expected behavior The Bundle resource should return a listing of resources.

Environment (please complete the following information):

  • HAPI FHIR Server 7.3.1-SNAPSHOT/d413af1777/2024-05-11

dotasek avatar Sep 12 '24 14:09 dotasek