Issue Summary
Performing a bulk move on issues tied to Assets Objects can result in a Null Pointer Exception and a 500 error screen when moving to the field mapping page of the bulk move.
Steps to Reproduce
We have not been able to replicate this behavior internally, but the issue was uncovered via a support issue. It was likely introduced via validation changes made for Jira 5.13 and higher.
- Attempt to perform a bulk move from one project to another project that contains an Assets Custom Field in both projects
- After selecting the issues that contain the Assets Custom Field, select the project and new issue type to move the issue to
- Select next to move to the field mapping screen
Expected Results
It would be expected that you would be able to map the fields and continue with the bulk move as you would for any projects not containing the Assets Custom Field.
Actual Results
An NPE occurs and the on the frontend the user will see a 500 error screen.
The NPE is within the atlassian-jira.log file:
2024-04-30 20:44:21,653+0000 http-nio-8080-exec-174 ERROR [o.a.c.c.C.[.[localhost].[/].[action]] Servlet.service() for servlet [action] in context with path [] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Unknown Source)
at java.base/java.util.Arrays$ArrayList.<init>(Unknown Source)
at java.base/java.util.Arrays.asList(Unknown Source)
at com.riadalabs.jira.plugins.insight.services.jira.customfield.DefaultObjectCustomField.getStringListMap(DefaultObjectCustomField.java:839)
at com.riadalabs.jira.plugins.insight.services.jira.customfield.DefaultObjectCustomField.getcustomFieldScopedIql(DefaultObjectCustomField.java:851)
at com.riadalabs.jira.plugins.insight.services.jira.customfield.DefaultObjectCustomField.isValidObjectBeanScope(DefaultObjectCustomField.java:880)
at com.riadalabs.jira.plugins.insight.services.jira.customfield.DefaultObjectCustomField.determineObjectBean(DefaultObjectCustomField.java:766)
at com.riadalabs.jira.plugins.insight.services.jira.customfield.DefaultObjectCustomField.validateFromParams(DefaultObjectCustomField.java:598)
at com.atlassian.jira.issue.fields.ImmutableCustomField.needsMove(ImmutableCustomField.java:1085)
at com.atlassian.jira.bulkedit.operation.BulkMoveOperationImpl.fieldNeedsMove(BulkMoveOperationImpl.java:1016)
at com.atlassian.jira.bulkedit.operation.BulkMoveOperationImpl.checkIfFieldsNeedsToBeMoved(BulkMoveOperationImpl.java:937)
at com.atlassian.jira.bulkedit.operation.BulkMoveOperationImpl.finishChooseContext(BulkMoveOperationImpl.java:494)
at com.atlassian.jira.bulkedit.operation.BulkMoveOperationImpl.finishChooseContext(BulkMoveOperationImpl.java:486)
at com.atlassian.jira.web.action.issue.bulkedit.BulkMigrate.doChooseContext(BulkMigrate.java:164)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:70)
at webwork.util.InjectionUtils.invoke(InjectionUtils.java:56)
... 2 filtered
at com.atlassian.jira.web.action.JiraWebActionSupport.execute(JiraWebActionSupport.java:1382)
... 7 filtered
at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
... 48 filtered
at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:55)
... 4 filtered
at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:56)
... 7 filtered
at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:54)
... 8 filtered
at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
... 4 filtered
at com.atlassian.app.usage.core.features.user.interaction.servlet.filter.CapturingServletFilter.doFilter(CapturingServletFilter.kt:38)
... 3 filtered
at com.atlassian.app.usage.core.features.common.usage.rest.filter.CapturingRestFilter.doFilter(CapturingRestFilter.kt:36)
... 47 filtered
Workaround
A workaround is to add assets.aql.scope.filtering.on.issue.update.disabled in the Jira Dark Features. This will disable a validation check added in Jira 5.13.0. Then the bulk move should proceed. Once that move is completed, the feature can be re-enabled moving forward.