{"record":{"id":"41b5d5a7c17a7d11","repo":"theonedev/onedev","slug":"duplicate-field-fieldname","errorCode":null,"errorMessage":"Duplicate field: ${fieldName}","messagePattern":"Duplicate field: (.+?)","errorType":"validation","errorClass":"ValidationException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/model/support/issue/field/FieldUtils.java","lineNumber":215,"sourceCode":"\t\tvalidateFieldNames(fieldSpecMap.keySet(), fieldMap.keySet());\n\t\tfor (Map.Entry<String, List<String>> entry: fieldMap.entrySet()) {\n\t\t\tif (entry.getValue() != null) {\n\t\t\t\tFieldSpec fieldSpec = Preconditions.checkNotNull(fieldSpecMap.get(entry.getKey()));\n\t\t\t\tvalidateFieldValue(fieldSpec, entry.getKey(), entry.getValue());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void validateFields(Map<String, FieldSpec> fieldSpecs, List<FieldInstance> fields) {\n\t\tMap<String, List<String>> fieldMap = new HashMap<>();\n\t\tfor (FieldInstance field: fields) {\n\t\t\tList<String> values;\n\t\t\tif (field.getValueProvider() instanceof SpecifiedValue)\n\t\t\t\tvalues = field.getValueProvider().getValue();\n\t\t\telse\n\t\t\t\tvalues = null;\n\t\t\tif (fieldMap.put(field.getName(), values) != null)\n\t\t\t\tthrow new ValidationException(\"Duplicate field: \" + field.getName());\n\t\t}\n\t\tvalidateFieldMap(fieldSpecs, fieldMap);\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static Map<String, Object> getFieldValues(Subject subject, Project project, Map<String, Serializable> fieldEdits) {\n\t\tvar settingService = OneDev.getInstance(SettingService.class);\n\t\tvar issueSetting = settingService.getIssueSetting();\n\t\tMap<String, Object> fieldValues = new HashMap<>();\n\t\tfor (Map.Entry<String, Serializable> entry : fieldEdits.entrySet()) {\n\t\t\tvar fieldName = entry.getKey();\n\t\t\tvar fieldSpec = issueSetting.getFieldSpec(fieldName);\n\t\t\tif (fieldSpec == null)\n\t\t\t\tthrow new NotAcceptableException(\"Undefined field: \" + fieldName);\n\t\t\tif (!SecurityUtils.canEditIssueField(subject, project, fieldName))\n\t\t\t\tthrow new UnauthorizedException(\"No permission to edit field: \" + fieldName);\n\n\t\t\tList<String> values = new ArrayList<>();","sourceCodeStart":197,"sourceCodeEnd":233,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/model/support/issue/field/FieldUtils.java#L197-L233","documentation":"validateFields builds a field map from FieldInstance objects; if two instances share the same field name (put returns a previous value), ValidationException 'Duplicate field: <name>' is thrown, then validateFieldMap runs on the deduplicated map.","triggerScenarios":"Submitting a collection of FieldInstances containing the same field name twice, e.g. duplicate form inputs or an API payload repeating a field.","commonSituations":"Buggy client code appending a field per iteration; duplicated issue template entries; merge of two field lists without deduplication.","solutions":["Deduplicate the field list by name before calling validateFields","Fix the client/form so each field appears only once","Use a Map<String,List<String>> keyed by field name to collect values"],"exampleFix":"// before\nfields.add(new FieldInstance(\"Priority\", ...));\nfields.add(new FieldInstance(\"Priority\", ...)); // duplicate\n// after\nMap<String,FieldInstance> byName = new LinkedHashMap<>();\nfields.forEach(f -> byName.putIfAbsent(f.getName(), f));\nvalidateFields(fieldSpecs, new ArrayList<>(byName.values()));","handlingStrategy":"validation","validationCode":"Set<String> seen = new HashSet<>();\nfor (FieldInstance f : fields)\n    if (!seen.add(f.getName()))\n        throw new IllegalStateException(\"Duplicate field: \" + f.getName());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Deduplicate form/model fields before validation","Key collections by field name (Map) instead of Lists","Add client-side uniqueness checks in issue forms"],"tags":["issue-fields","validation","duplicates"],"backgroundTag":"invalid-argument-value","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}