{"record":{"id":"6f836e2b0594dc24","repo":"alibaba/spring-ai-alibaba","slug":"itemids","errorCode":null,"errorMessage":"解析itemIds字符串失败: {}","messagePattern":"解析itemIds字符串失败: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/utils/CommonUtils.java","lineNumber":24,"sourceCode":"import java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Slf4j\npublic class CommonUtils {\n\n    public static List<Long> parseItemIds(String itemIds) {\n        if (itemIds == null || itemIds.trim().isEmpty()) {\n            return new ArrayList<>();\n        }\n\n        try {\n            JSONArray jsonArray = JSONArray.parseArray(itemIds);\n            return jsonArray.stream()\n                    .map(obj -> Long.valueOf(obj.toString()))\n                    .collect(Collectors.toList());\n        } catch (Exception e) {\n            log.warn(\"解析itemIds字符串失败: {}\", itemIds, e);\n            return new ArrayList<>();\n        }\n    }\n\n\n    public static String extractRawText(String markdownCode) {\n        // Find the start of a code block (3 or more backticks)\n        int startIndex = -1;\n        int delimiterLength = 0;\n\n        for (int i = 0; i <= markdownCode.length() - 3; i++) {\n            if (markdownCode.substring(i, i + 3).equals(\"```\")) {\n                startIndex = i;\n                delimiterLength = 3;\n                // Count additional backticks\n                while (i + delimiterLength < markdownCode.length() && markdownCode.charAt(i + delimiterLength) == '`') {\n                    delimiterLength++;\n                }","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/utils/CommonUtils.java#L6-L42","documentation":"CommonUtils.parseItemIds parses a JSON array string (e.g. \"[1,2,3]\") into a List<Long>; when JSONArray.parseArray or the Long conversion throws, it logs this warning and returns an empty ArrayList rather than propagating the exception. Callers silently receive an empty item id list for malformed input.","triggerScenarios":"Passing a string that is not a JSON array of numbers — e.g. null, empty string, plain text, \"1,2,3\" without brackets, or array elements that are non-numeric strings like \"abc\".","commonSituations":"Frontend sending an unserialized comma-separated string instead of JSON; form field left empty; legacy data stored in a different delimiter format; double-encoded JSON strings.","solutions":["Send/serialize the field as a proper JSON array of numeric ids, e.g. \"[1,2,3]\"","Guard at the caller: validate the string is a non-empty JSON array before calling parseItemIds","Handle the empty-list return explicitly — treat it as invalid input rather than 'no items' if ids are required","Normalize legacy comma-separated data before parsing"],"exampleFix":"// before\nList<Long> ids = CommonUtils.parseItemIds(\"1,2,3\"); // returns []\n// after\nList<Long> ids = CommonUtils.parseItemIds(\"[1,2,3]\");\nif (ids.isEmpty() && StringUtils.isNotBlank(raw)) { throw new IllegalArgumentException(\"Invalid itemIds: \" + raw); }","handlingStrategy":"validation","validationCode":"if (StringUtils.isNotBlank(itemIdsStr) && itemIdsStr.trim().startsWith(\"[\") && itemIdsStr.trim().endsWith(\"]\")) { ids = CommonUtils.parseItemIds(itemIdsStr); }","typeGuard":"boolean isJsonArrayOfNumbers(String s) { if (s == null) return false; String t = s.trim(); return t.startsWith(\"[\") && t.endsWith(\"]\") && !t.equals(\"[]\"); }","tryCatchPattern":null,"preventionTips":["Serialize ids as a JSON array, not comma-separated strings","Validate input format on the client before submit","Treat empty parse results as invalid input when ids are required"],"tags":["json","parsing","input-validation"],"backgroundTag":"json-parse-error","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}