hapi-fhir: Mdm: auto link creation NullPointerException "org.hl7.fhir.instance.model.api.IAnyResource.getUserData(String)" because "theResource" is null
Describe the bug With the mdm enabled, when I push 2 patients. The second mdm link is not created. reason is unknown. An Exception stack is thrown int he server
To Reproduce Steps to reproduce the behavior:
- $mdm-clear
- delete all patients (DELETE http://localhost:8888/fhir/Patient?identifier=http%3A%2F%2Fcns.lu%2Fpatient%2Fmatricule|)
- create 2 patients (actually using an update to force the id of the Patient resource to a custom id) (always recreating the same patient)
- $mdm-query-links
expecting 2 links but only one is created.
Expected behavior
error stack into the
2022-07-13 16:24:19.820 [empi-1] ERROR ca.uhn.fhir.log.mdm_troubleshooting [MdmMessageHandler.java:183] Failure during MDM processing: Cannot invoke "org.hl7.fhir.instance.model.api.IAnyResource.getUserData(String)" because "theResource" is null java.lang.NullPointerException: Cannot invoke "org.hl7.fhir.instance.model.api.IAnyResource.getUserData(String)" because "theResource" is null at ca.uhn.fhir.jpa.dao.index.IdHelperService.getPidOrThrowException(IdHelperService.java:634) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl.goldenResourceLinkedAsNoMatch(MdmLinkSvcImpl.java:82) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl.updateLink(MdmLinkSvcImpl.java:64) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl$$FastClassBySpringCGLIB$$5cb436e9.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl$$EnhancerBySpringCGLIB$$d3544dbd.updateLink(<generated>) at ca.uhn.fhir.jpa.mdm.svc.MdmEidUpdateService.linkToNewGoldenResourceAndFlagAsDuplicate(MdmEidUpdateService.java:129) at ca.uhn.fhir.jpa.mdm.svc.MdmEidUpdateService.handleMdmUpdate(MdmEidUpdateService.java:83) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.handleMdmWithSingleCandidate(MdmMatchLinkSvc.java:161) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.doMdmUpdate(MdmMatchLinkSvc.java:86) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.updateMdmLinksForMdmSource(MdmMatchLinkSvc.java:74) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc$$FastClassBySpringCGLIB$$95ebff3e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc$$EnhancerBySpringCGLIB$$7ebd03dc.updateMdmLinksForMdmSource(<generated>) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.handleUpdateResource(MdmMessageHandler.java:173) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.matchMdmAndUpdateLinks(MdmMessageHandler.java:106) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.handleMessage(MdmMessageHandler.java:84) at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) 2022-07-13 16:24:19.820 [empi-1] ERROR ca.uhn.fhir.log.mdm_troubleshooting [MdmMessageHandler.java:183] Failure during MDM processing: Cannot invoke "org.hl7.fhir.instance.model.api.IAnyResource.getUserData(String)" because "theResource" is null java.lang.NullPointerException: Cannot invoke "org.hl7.fhir.instance.model.api.IAnyResource.getUserData(String)" because "theResource" is null at ca.uhn.fhir.jpa.dao.index.IdHelperService.getPidOrThrowException(IdHelperService.java:634) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl.goldenResourceLinkedAsNoMatch(MdmLinkSvcImpl.java:82) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl.updateLink(MdmLinkSvcImpl.java:64) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl$$FastClassBySpringCGLIB$$5cb436e9.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at ca.uhn.fhir.jpa.mdm.svc.MdmLinkSvcImpl$$EnhancerBySpringCGLIB$$d3544dbd.updateLink(<generated>) at ca.uhn.fhir.jpa.mdm.svc.MdmEidUpdateService.linkToNewGoldenResourceAndFlagAsDuplicate(MdmEidUpdateService.java:129) at ca.uhn.fhir.jpa.mdm.svc.MdmEidUpdateService.handleMdmUpdate(MdmEidUpdateService.java:83) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.handleMdmWithSingleCandidate(MdmMatchLinkSvc.java:161) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.doMdmUpdate(MdmMatchLinkSvc.java:86) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc.updateMdmLinksForMdmSource(MdmMatchLinkSvc.java:74) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc$$FastClassBySpringCGLIB$$95ebff3e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at ca.uhn.fhir.jpa.mdm.svc.MdmMatchLinkSvc$$EnhancerBySpringCGLIB$$7ebd03dc.updateMdmLinksForMdmSource(<generated>) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.handleUpdateResource(MdmMessageHandler.java:173) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.matchMdmAndUpdateLinks(MdmMessageHandler.java:106) at ca.uhn.fhir.jpa.mdm.broker.MdmMessageHandler.handleMessage(MdmMessageHandler.java:84) at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
Screenshots NA
Environment (please complete the following information):
- HAPI FHIR Version 5.7.0
- OS: Windows
- Browser NA
Additional context In attachement, the client trace, the mdm server trace, the patients, the link created.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 19
I have made the fix! It it in a PR here: https://github.com/hapifhir/hapi-fhir/pull/3851
It will be available in 6.1.0 when it is released.