Details
-
Bug
-
Resolution: Unresolved
-
Low
-
None
-
7.13.9, 8.20.6, 9.4.14
-
None
-
7.13
-
18
-
Severity 2 - Major
-
12
-
Description
Issue Summary
Duplicate fields are added to a screen and it causes errors when checking the Required fields to create an issue in a project using a REST API, or when accessing Custom Fields configuration page from JIRA → Settings → Custom Fields, etc.
Steps to Reproduce
- Navigate to JIRA Administration > Issues ># Screens
- Look for the problematic screen
- Click Configure
Expected Results
The screen configuration screen should open without any error
Actual Results
The exception below is thrown on the UI:
and exception below is thrown in the atlassian-jira.log file:
2020-07-22 08:31:07,099 http-nio-8080-exec-331 url:/secure/admin/C...ayout!default.jspa username:xxxxxx url:/secure/admin/v...urefieldlayout.jsp username:xxxxx ERROR 1612816 510x5524331x11 8378d3 xxx.xxx.xxxx.xxxx /secure/admin/Confi gureFieldLayout!default.jspa [webwork.util.ValueStack] METHOD: "fieldScreenTabs", exception: java.lang.IllegalStateException: Duplicate key com.atlassian.jira.issue.fields.screen.FieldScreenLayoutItemImpl@7335f3a0 at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1254) at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.atlassian.jira.issue.fields.screen.FieldScreenTabImpl$LayoutItems.<init>(FieldScreenTabImpl.java:217) at com.atlassian.jira.issue.fields.screen.FieldScreenTabImpl$LayoutItems.<init>(FieldScreenTabImpl.java:208) at com.atlassian.jira.issue.fields.screen.FieldScreenTabImpl.getLayoutItems(FieldScreenTabImpl.java:34) at com.atlassian.jira.issue.fields.screen.FieldScreenTabImpl.getFieldScreenLayoutItem(FieldScreenTabImpl.java:172) at com.atlassian.jira.issue.fields.screen.DefaultFieldScreenManager.getFieldScreenTabs(DefaultFieldScreenManager.java:43) at com.atlassian.jira.web.action.admin.issuefields.AbstractConfigureFieldLayout.getFieldScreenTabs(AbstractConfigureFieldLayout.java:158) ... 2 filtered at java.lang.reflect.Method.invoke(Method.java:498) at webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:70) at webwork.util.InjectionUtils.invoke(InjectionUtils.java:56) at webwork.util.ValueStack.findValue(ValueStack.java:517) at webwork.util.SimpleTest.test(SimpleTest.java:408) at webwork.util.ValueStack.test(ValueStack.java:157) at webwork.view.taglib.IfTag.doStartTag(IfTag.java:40) at jsp.secure.admin.views.issuefields.configurefieldlayout_jsp._jspService(configurefieldlayout_jsp.java:340) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ... 48 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 38 filtered at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37) ... 10 filtered at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66) ... 1 filtered at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64) ... 20 filtered at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30) ... 5 filtered at com.valiantys.jira.plugins.sql.service.servletcontext.ContextListenerServletFilter.doFilter(ContextListenerServletFilter.java:24) ... 3 filtered at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37) ... 10 filtered at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25) ... 11 filtered at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ... 48 filtered at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:62) ... 12 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 47 filtered at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53) at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37) ... 18 filtered at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66) ... 1 filtered at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64) ... 39 filtered at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30) ... 5 filtered at com.valiantys.jira.plugins.sql.service.servletcontext.ContextListenerServletFilter.doFilter(ContextListenerServletFilter.java:24) ... 8 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:69) 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) ... 26 filtered at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25) ... 26 filtered at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
Workaround
- Run the query b below to find out the duplicated value:
select f.name, i.fieldidentifier, count(*) from fieldscreen f, fieldscreenlayoutitem i, fieldscreentab t where f.id = t.fieldscreen and i.fieldscreentab = t.id group by f.name, i.fieldidentifier having count(*) > 1;
If there is a duplicate, an example of a result is below:
name | fieldidentifier | count ---------------------------------+-----------------+------- SSD: Scrum Default Issue Screen | assignee | 2
- Navigate to JIRA Administration > Issues > Screens
- Look for the Screen mentioned in the SQL query result e.g. "SSD: Scrum Default Issue Screen"
- Click Configure and look for the field e.g. "assignee"
- Remove one of the fields from the screen.
If the duplicate field is not shown on the screen or if the screen cannot be opened, the solution is to delete duplicate field references directly from the database.
Please back up your database before proceeding with this workaround. Also, if possible, test the workaround on a staging environment before applying it to production.
The steps are as follows:
- Identify and write down ID value for each duplicate field reference; screen name and field identifier need to be modified accordingly. For the current example, the ID can be identified as follows::
select f.name, i.id, i.fieldidentifier from fieldscreen f, fieldscreenlayoutitem i, fieldscreentab t where f.id = t.fieldscreen and i.fieldscreentab = t.id and f.name like '%SSD: Scrum Default Issue Screen%' and i.fieldidentifier='assignee';
- Delete all duplicate rows from fieldscreenlayoutitem table and retain only one row.
delete from fieldscreenlayoutitemwhere id = <duplicate_id>;
- Restart Jira