Jira throws NullPointerException when you try to run REST API call against the /worklog/updates endpoint

Platform Notice: Data Center Only - This article only applies to Atlassian products on the Data Center platform.

Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.

*Except Fisheye and Crucible

Summary

Jira throws NullPointerException when you try to run a GET call against the /worklog/updates endpoint

Environment

8.22.6

8.13.18

Diagnosis

  1. Jira returns the following error as response when you try to run a GET call against the /worklog/updates endpoint (eg. GET <BaseURL>/rest/api/2/worklog/updated?since=0)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <status> <status-code>500</status-code> <stack-trace>java.lang.NullPointerException at com.atlassian.jira.security.DefaultPermissionManager.doIssuePermissionCheck(DefaultPermissionManager.java:142) at com.atlassian.jira.security.DefaultPermissionManager.hasPermission(DefaultPermissionManager.java:94) at com.atlassian.jira.security.WorkflowBasedPermissionManager.hasPermission(WorkflowBasedPermissionManager.java:86) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.lambda$hasPermission$1(ApplicationRequiredPermissionManager.java:85) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.checkUserHasApplicationOrFalse(ApplicationRequiredPermissionManager.java:202) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.hasPermission(ApplicationRequiredPermissionManager.java:85) at com.atlassian.jira.security.PublicAccessPermissionManager.lambda$hasPermission$1(PublicAccessPermissionManager.java:80) at com.atlassian.jira.security.PublicAccessPermissionManager.checkPublicAccessEnabledOrDelegate(PublicAccessPermissionManager.java:193) at com.atlassian.jira.security.PublicAccessPermissionManager.hasPermission(PublicAccessPermissionManager.java:80) at jdk.internal.reflect.GeneratedMethodAccessor965.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.atlassian.jira.config.component.SwitchingInvocationHandler.invoke(SwitchingInvocationHandler.java:38) at com.sun.proxy.$Proxy30.hasPermission(Unknown Source) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.hasViewPermission(DefaultWorklogService.java:740) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.hasPermissionToView(DefaultWorklogService.java:557) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.lambda$filter$1(DefaultWorklogService.java:617) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.filter(DefaultWorklogService.java:618) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.getWorklogsUpdatedSince(DefaultWorklogService.java:586) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) ... </stack-trace> </status>
  2. Jira prints the following error in the atlassian-jira.log for the same attempt

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 2022-07-26 11:21:55,425+0200 http-nio-48226-exec-25 ERROR admin 681x296x1 3240bd 0:0:0:0:0:0:0:1 /rest/api/2/worklog/updated [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: null java.lang.NullPointerException at com.atlassian.jira.security.DefaultPermissionManager.doIssuePermissionCheck(DefaultPermissionManager.java:142) at com.atlassian.jira.security.DefaultPermissionManager.hasPermission(DefaultPermissionManager.java:94) at com.atlassian.jira.security.WorkflowBasedPermissionManager.hasPermission(WorkflowBasedPermissionManager.java:86) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.lambda$hasPermission$1(ApplicationRequiredPermissionManager.java:85) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.checkUserHasApplicationOrFalse(ApplicationRequiredPermissionManager.java:202) at com.atlassian.jira.security.ApplicationRequiredPermissionManager.hasPermission(ApplicationRequiredPermissionManager.java:85) at com.atlassian.jira.security.PublicAccessPermissionManager.lambda$hasPermission$1(PublicAccessPermissionManager.java:80) at com.atlassian.jira.security.PublicAccessPermissionManager.checkPublicAccessEnabledOrDelegate(PublicAccessPermissionManager.java:193) at com.atlassian.jira.security.PublicAccessPermissionManager.hasPermission(PublicAccessPermissionManager.java:80) at jdk.internal.reflect.GeneratedMethodAccessor965.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.atlassian.jira.config.component.SwitchingInvocationHandler.invoke(SwitchingInvocationHandler.java:38) at com.sun.proxy.$Proxy30.hasPermission(Unknown Source) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.hasViewPermission(DefaultWorklogService.java:740) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.hasPermissionToView(DefaultWorklogService.java:557) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.lambda$filter$1(DefaultWorklogService.java:617) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.filter(DefaultWorklogService.java:618) at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.getWorklogsUpdatedSince(DefaultWorklogService.java:586) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26) at com.sun.proxy.$Proxy235.getWorklogsUpdatedSince(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137) at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70) at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137) at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy9033.getWorklogsUpdatedSince(Unknown Source) at com.atlassian.jira.rest.v2.issue.worklog.WorklogResource.getIdsOfWorklogsModifiedSince(WorklogResource.java:76) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) ...
  3. Running the following query returns one or more results

    1 2 3 4 5 SELECT * FROM WORKLOG WHERE ISSUEID not in (SELECT ID FROM JIRAISSUE);
  4. Running the call with a more recent timestamp might be successful

    1 GET <BaseURL>/rest/api/2/worklog/updated?since=1658827167249
    1 2 3 4 5 6 7 { "values": [], "since": 1658827167249, "until": 1658827167249, "self": "http://localhost:48226/j8226/rest/api/2/worklog/updated?since=1658827167249", "lastPage": true }

Cause

  • This error is thrown when the GET call returns a worklog entry linked to an ID that does not exist in the jiraissue table. The DB query above returns all such records in the worklog table.

  • It is not known how the database can end up in this situation. Jira is currently not known to create/delete entries in such a manner. The only known possibility at the moment is something external removing entries in the jiraissue table or modifying entries in the worklog. For example, someone attempted to housekeep the jiraissue table by manually removing entries from it.

Solution

  • The best scenario would be to roll back the database to a point where such inconsistencies don't exist

  • If the above is not possible, you will have to consider manually modifying the database so that the worklog.issueid is linked to existing Jira issue IDs. Note that this will cause the data to no longer be accurate if you plan to use it for reporting.

Updated on March 10, 2025

Still need help?

The Atlassian Community is here for you.