NullPointerException in ParentLinkCleanupService and NotificationRecipientHelper when adding comment via PUT /rest/api/2/issue/{key} — violates documented IssueEvent API contract

XMLWordPrintable

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Low
    • None
    • Affects Version/s: 11.3.7, 10.3.23
    • Component/s: Issue - Comments, REST API
    • None
    • 10.03
    • 4
    • Severity 3 - Minor
    • 8

      Issue Summary

      When a comment is added to an issue using the generic issue update endpoint (PUT /rest/api/2/issue/{issueIdOrKey}{}) with only a comment in the payload and no field changes, two event listeners crash with a NullPointerException.

      Steps to Reproduce

      • Install Jira Software 10.3.16 or above
      • Create a project and a test issue - TEST-1
      • Add a comment to the TEST-1 using the REST API - PUT /rest/api/2/issue/{key} 

      Expected Results

      • Comment is added
      • No errors in the log
      • Event listeners handle null changelog gracefully (as documented in the API contract)

      Actual Results

      The below exceptions are thrown in the atlassian-jira.log file:

      2026-07-09 11:20:44,540+0000 http-nio-8080-exec-6 url: /jira/rest/api/2/issue/TEST-1; user: admin ERROR admin 680x309x1 1tnahl9 10.140.13.100,172.50.0.3 /rest/api/2/issue/TEST-1 [c.a.r.j.c.parent.cleanup.ParentLinkCleanupService] Cannot invoke "org.ofbiz.core.entity.GenericValue.getRelated(String)" because the return value of "com.atlassian.jira.event.issue.IssueEvent.getChangeLog()" is null
      java.lang.NullPointerException: Cannot invoke "org.ofbiz.core.entity.GenericValue.getRelated(String)" because the return value of "com.atlassian.jira.event.issue.IssueEvent.getChangeLog()" is null
      	at com.atlassian.rm.jpo.customfields.parent.cleanup.ParentLinkCleanupService.isIssueTypeChanged(ParentLinkCleanupService.java:122)
      	at com.atlassian.rm.jpo.customfields.parent.cleanup.ParentLinkCleanupService.onIssueEvent(ParentLinkCleanupService.java:61)
      	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
      	at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:42)
      	at com.atlassian.diagnostics.internal.platform.monitor.event.EventSystemMonitor.invokeMonitored(EventSystemMonitor.java:109)
      	at com.atlassian.diagnostics.internal.platform.monitor.event.MonitoredListenerInvoker.invoke(MonitoredListenerInvoker.java:38)
      	at com.atlassian.event.internal.ComparableListenerInvoker.invoke(ComparableListenerInvoker.java:48)
      	at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.lambda$static$0(AsynchronousAbleEventDispatcher.java:38)
      	at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.dispatch(AsynchronousAbleEventDispatcher.java:89)
      	at com.atlassian.diagnostics.internal.platform.monitor.event.MonitoredEventDispatcher.dispatch(MonitoredEventDispatcher.java:35)
      	at com.atlassian.event.internal.EventPublisherImpl.publish(EventPublisherImpl.java:103)
      	at com.atlassian.jira.event.issue.DefaultIssueEventManager.publishEventIfNotificationsAreEnabled(DefaultIssueEventManager.java:180)
      
      2026-07-09 11:20:45,033+0000 JIRA-INFORM-Thread-0 WARN      [c.a.j.p.m.service.helper.NotificationRecipientHelper] Cannot get change items
      java.lang.NullPointerException: Cannot invoke "org.ofbiz.core.entity.GenericValue.getRelated(String)" because the return value of "com.atlassian.jira.event.issue.IssueEvent.getChangeLog()" is null
      	at com.atlassian.jira.plugin.mobile.service.helper.NotificationRecipientHelper.isSupportedIssueUpdateEvent(NotificationRecipientHelper.java:137)
      	at com.atlassian.jira.plugin.mobile.service.helper.NotificationRecipientHelper.isSupportedEvent(NotificationRecipientHelper.java:129)
      	at com.atlassian.jira.plugin.mobile.service.helper.NotificationRecipientHelper.isValidIssueEvent(NotificationRecipientHelper.java:115)
      	at com.atlassian.jira.plugin.mobile.service.impl.MobileNotificationRecipientServiceImpl.getRecipientUserKeys(MobileNotificationRecipientServiceImpl.java:47)
      	at com.atlassian.jira.plugin.mobile.service.provider.MobileNotificationRecipientProvider.getRecipients(MobileNotificationRecipientProvider.java:37)
      	at com.atlassian.jira.plugins.inform.events.convert.EventConverterImpl.safeGet(EventConverterImpl.java:71)
      	at com.atlassian.jira.plugins.inform.events.convert.EventConverterImpl.lambda$convert$0(EventConverterImpl.java:53)
      	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
      	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      

      Workaround

      Use the dedicated comment endpoint: POST /rest/api/2/issue/{issueIdOrKey}/comment

      This fires an ISSUE_COMMENTED event type (not a generic update event) which does not trigger the affected listeners.

              Assignee:
              Unassigned
              Reporter:
              Sandhya Thottamkara
              Votes:
              5 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated: