-
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
- 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.
- Create at least one issue using that issue type in any project.
- Create or use a saved filter whose results include at least one such issue (in addition to issues that DO use Fix Version/s).
- Add a "2D Filter Statistics" gadget to a dashboard.
- Configure the gadget with:
- Saved Filter: the filter from step 3
- X-Axis: Assignee
- Y-Axis: Fix Version/s (all)
- 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.