2D Filter Statistics gadget fails with NullPointerException if the Y-axis field isn’t in any returned issue type’s field configuration.

XMLWordPrintable

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Low
    • None
    • Affects Version/s: 11.3.6
    • Component/s: Dashboard & Gadgets
    • None
    • 11.03
    • 1
    • Severity 3 - Minor

      Issue Summary

      After upgrading Jira from 10.3.19 to 11.3.6, the 2D Filter Statistics dashboard gadget fails to render and remains in a perpetual loading state when:

      • The Y-axis is configured to a field such as "Fix Version/s (all)"
      • The underlying filter returns at least one issue whose issue type's field configuration excludes that Y-axis field (e.g., a "Story" issue type that does not use Fix Version/s)

      In Jira 10.3.x, such issues were correctly aggregated under an "Irrelevant" row in the gadget. In 11.3.6, the gadget REST endpoint /rest/gadget/1.0/twodimensionalfilterstats/generate returns HTTP 500 with a NullPointerException thrown from TwoDimensionalStatsResource.optionallyAddIrrelevantRow() and gadget keeps loading.

      Steps to Reproduce

      1. In Jira 11.3.6, create at least one custom issue type (e.g., "Container") and assign it a field configuration that does NOT include the "Fix Version/s" field.
      2. Create at least one issue using that issue type in any project.
      3. Create or use a saved filter whose results include at least one such issue (in addition to issues that DO use Fix Version/s).
      4. Add a "2D Filter Statistics" gadget to a dashboard.
      5. Configure the gadget with:
        • Saved Filter: the filter from step 3
        • X-Axis: Assignee
        • Y-Axis: Fix Version/s (all)
      6. Load/refresh the dashboard.

      Expected Results

      The gadget renders successfully and displays:

      • One row per Fix Version
      • An "Unscheduled" row for issues with no Fix Version assigned
      • An "Irrelevant" row for issues whose issue type field configuration does not include Fix Version/s

      (This is the behavior observed in Jira 10.3.19.)

      Actual Results

      • The gadget shows a perpetual loading indicator and never renders (see attached screenshot)
      • The REST endpoint /rest/gadget/1.0/twodimensionalfilterstats/generate returns HTTP 500.
      • The Jira application log shows a NullPointerException originating in TwoDimensionalStatsResource.optionallyAddIrrelevantRow . Below is the stack trace
        2026-05-22 15:57:11,009+0200 http-nio-8080-exec-15 url: /rest/gadget/1.0/twodimensionalfilterstats/generate; user: RM ERROR RM 957x23673x1 1wexcz6 x.x.x.x /rest/gadget/1.0/twodimensionalfilterstats/generate [o.g.jersey.server.ServerRuntime$Responder] An I/O error has occurred while writing a response message entity to the container output stream.
        org.glassfish.jersey.server.internal.process.MappableException: java.lang.NullPointerException: Cannot invoke "Object.equals(Object)" because the return value of "com.atlassian.jira.search.aggregation.twodimensional.Statistic.value()" is null
        	at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:67)
        	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        	at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116)
        	at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:691)
        	at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:398)
        	at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:388)
        	at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
        	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
        	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
        	at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
        	at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
        	at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
        	at com.atlassian.troubleshooting.thready.filter.AbstractThreadNamingFilter.doFilter(AbstractThreadNamingFilter.java:46)
        	... 3 filtered
        	at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:38)
        	... 26 filtered
        	at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:27)
        	... 25 filtered
        	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973)
        	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491)
        	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
        	at java.base/java.lang.Thread.run(Thread.java:1583)
        Caused by: java.lang.NullPointerException: Cannot invoke "Object.equals(Object)" because the return value of "com.atlassian.jira.search.aggregation.twodimensional.Statistic.value()" is null
        	at com.atlassian.jira.gadgets.system.TwoDimensionalStatsResource.optionallyAddIrrelevantRow(TwoDimensionalStatsResource.java:414)
        	at com.atlassian.jira.gadgets.system.TwoDimensionalStatsResource.makeSubsequentRows(TwoDimensionalStatsResource.java:331)
        	at com.atlassian.jira.gadgets.system.TwoDimensionalStatsResource.sendStatsUsingSearchApi(TwoDimensionalStatsResource.java:279)
        	at com.atlassian.jira.gadgets.system.TwoDimensionalStatsResource.lambda$getStatsUsingSearchApi$0(TwoDimensionalStatsResource.java:224)
        	at org.glassfish.jersey.message.internal.StreamingOutputProvider.writeTo(StreamingOutputProvider.java:55)
        	at org.glassfish.jersey.message.internal.StreamingOutputProvider.writeTo(StreamingOutputProvider.java:37)
        	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:242)
        	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)
        	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        	at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:85)
        	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        	at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:61)
        	... 342 more
        
        
          

      Workaround

      • Modify the saved filter to exclude issues whose issue types do not include Fix Version/s in their field configuration (these issues will then be missing from the gadget output).
      • Alternatively, swap the X-Axis and Y-Axis values (put Fix Version/s on the X-Axis and Assignee on the Y-Axis) — the issue is specific to the Y-Axis handling.

              Assignee:
              Unassigned
              Reporter:
              Vamshi R
              Votes:
              1 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated: