Summary
If the reporter on an issue is also listed as a request participant, the issue cannot be transitioned via the customer portal.
Environment
JIRA Service Desk Server 3.4.0
Steps to Reproduce
- Using a third party scripting utility (such as ScriptRunner or Power Scripts for JIRA), add a post-function on the Create transition which copies the issue Reporter to Request participants.
- Create an issue and specify a customer as the Reporter.
- Sign in to the service desk portal as that customer and attempt to transition the issue.
Expected Results
The issue transitions properly.
Actual Results
A generic error is thrown to the user. The following appears in atlassian-jira.log
2017-05-24 09:56:13,133 http-nio-8082-exec-12 url:/rest/servicedesk/1/custo.../transition username:katr003 ERROR katr003 596x219709x9 17nivfx 207.61.145.4,10.0.0.7 /rest/servicedesk/1/customer/requests/transition [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: null
java.lang.NullPointerException
at com.atlassian.jira.workflow.OSWorkflowManager.getWorkflow(OSWorkflowManager.java:276)
at com.atlassian.jira.workflow.OSWorkflowManager.getActionDescriptor(OSWorkflowManager.java:389)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26)
at com.sun.proxy.$Proxy96.getActionDescriptor(Unknown Source)
... 3 filtered
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
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:179)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
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:179)
at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy3600.getActionDescriptor(Unknown Source)
at com.atlassian.servicedesk.internal.feature.customer.transitions.CustomerTransitionInternalServiceImpl.validateAndIncludeComment(CustomerTransitionInternalServiceImpl.java:313)
at com.atlassian.servicedesk.internal.feature.customer.transitions.CustomerTransitionInternalServiceImpl.validateTransition(CustomerTransitionInternalServiceImpl.java:292)
at com.atlassian.servicedesk.internal.feature.customer.transitions.CustomerTransitionInternalServiceImpl.executeTransition(CustomerTransitionInternalServiceImpl.java:263)
at com.atlassian.servicedesk.internal.feature.customer.transitions.CustomerTransitionInternalServiceImpl.lambda$executeCustomerTransition$0(CustomerTransitionInternalServiceImpl.java:134)
at io.atlassian.fugue.Either$RightProjection.flatMap(Either.java:870)
at io.atlassian.fugue.Either.flatMap(Either.java:230)
at com.atlassian.pocketknife.step.EitherStep1.then(EitherStep1.java:18)
at com.atlassian.servicedesk.internal.feature.customer.transitions.CustomerTransitionInternalServiceImpl.executeCustomerTransition(CustomerTransitionInternalServiceImpl.java:134)
at com.atlassian.servicedesk.internal.rest.customers.transitions.CustomerTransitionResource.lambda$doTransition$5(CustomerTransitionResource.java:89)
at io.atlassian.fugue.Either$RightProjection.flatMap(Either.java:870)
at io.atlassian.fugue.Either.flatMap(Either.java:230)
at com.atlassian.pocketknife.step.EitherStep1.then(EitherStep1.java:18)
at com.atlassian.servicedesk.internal.rest.customers.transitions.CustomerTransitionResource.doTransition(CustomerTransitionResource.java:89)
at com.atlassian.servicedesk.internal.rest.customers.transitions.CustomerTransitionResource.lambda$transitionRequest$0(CustomerTransitionResource.java:70)
at io.atlassian.fugue.Either$RightProjection.flatMap(Either.java:870)
at io.atlassian.fugue.Either.flatMap(Either.java:230)
at com.atlassian.pocketknife.step.EitherStep1.then(EitherStep1.java:18)
at com.atlassian.servicedesk.internal.rest.customers.transitions.CustomerTransitionResource.transitionRequest(CustomerTransitionResource.java:70)
... 3 filtered
at java.lang.reflect.Method.invoke(Method.java:498)
... 18 filtered
at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:154)
... 1 filtered
at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:68)
... 32 filtered
at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:56)
... 4 filtered
at com.atlassian.servicedesk.internal.web.UrlOperationalStatusCheckFilter.doFilterWhenLicensed(UrlOperationalStatusCheckFilter.java:38)
at com.atlassian.servicedesk.internal.web.OperationalStatusAwareHttpFilter.doFilter(OperationalStatusAwareHttpFilter.java:27)
... 4 filtered
at com.atlassian.servicedesk.internal.web.PopulateEyeballForRestFilter.doFilterWhenLicensed(PopulateEyeballForRestFilter.java:36)
at com.atlassian.servicedesk.internal.web.OperationalStatusAwareHttpFilter.doFilter(OperationalStatusAwareHttpFilter.java:27)
... 8 filtered
at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
... 42 filtered
at com.resolution.atlasplugins.samlsso.servlet.RedirectToSsoFilter.doFilter(RedirectToSsoFilter.java:45)
... 3 filtered
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:71)
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
... 14 filtered
at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:80)
... 1 filtered
at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:78)
... 16 filtered
at com.atlassian.plugins.rest.module.servlet.RestSeraphFilter.doFilter(RestSeraphFilter.java:37)
... 20 filtered
at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
... 5 filtered
at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:181)
at com.atlassian.servicedesk.internal.utils.context.ReentrantThreadLocalBasedCodeContext.rteInvoke(ReentrantThreadLocalBasedCodeContext.java:139)
at com.atlassian.servicedesk.internal.utils.context.ReentrantThreadLocalBasedCodeContext.runInContext(ReentrantThreadLocalBasedCodeContext.java:57)
at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.runInCustomerContext(CustomerContextServiceImpl.java:38)
at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.inCustomerContext(CustomerContextSettingFilter.java:169)
at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:128)
at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:121)
... 9 filtered
at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:32)
... 3 filtered
at com.invisionapp.integration.jira.plugin.rest.RestAuthenticationFilter.doFilter(RestAuthenticationFilter.java:97)
... 3 filtered
at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
... 4 filtered
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:71)
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
... 3 filtered
at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36)
... 7 filtered
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:220)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:197)
at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:85)
at net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:128)
... 25 filtered
at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
... 28 filtered
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Workaround
- Transition the issue via Service Desk agent issue view.
- Modify any third-party scripts to prevent them from adding a customer to Request Participants if that customer is also the Reporter on an issue.
Notes
Related to JSDCLOUD-5241