{"record":{"id":"868bd2b081aefddd","repo":"alibaba/spring-ai-alibaba","slug":"defaultparameters","errorCode":null,"errorMessage":"序列化 defaultParameters 失败","messagePattern":"序列化 defaultParameters 失败","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/repository/impl/FileModelConfigRepository.java","lineNumber":152,"sourceCode":"        if (!names.add(m.name)) {\n            throw new IllegalArgumentException(\"重复的模型 name: \" + m.name);\n        }\n        if (m.status == null) {\n            m.status = 1;\n        }\n    }\n    \n    private ModelConfigDO toEntity(YamlModel m) {\n        ModelConfigDO.ModelConfigDOBuilder b = ModelConfigDO.builder().id(m.id).name(m.name)\n                .provider(m.provider.toLowerCase()).modelName(m.modelName).baseUrl(m.baseUrl)\n                .apiKey(environment != null ? environment.resolvePlaceholders(m.apiKey) : m.apiKey).status(m.status)\n                .createTime(LocalDateTime.now()).updateTime(LocalDateTime.now());\n        \n        if (m.defaultParameters != null) {\n            try {\n                b.defaultParameters(new ObjectMapper().writeValueAsString(m.defaultParameters));\n            } catch (Exception e) {\n                throw new IllegalArgumentException(\"序列化 defaultParameters 失败\", e);\n            }\n        }\n        if (m.supportedParameters != null) {\n            try {\n                b.supportedParameters(new ObjectMapper().writeValueAsString(m.supportedParameters));\n            } catch (Exception e) {\n                throw new IllegalArgumentException(\"序列化 supportedParameters 失败\", e);\n            }\n        }\n        return b.build();\n    }\n    \n    private void startWatchService() {\n        try {\n            Path dir = this.configPath.getParent();\n            if (dir == null) {\n                return;\n            }","sourceCodeStart":134,"sourceCodeEnd":170,"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/repository/impl/FileModelConfigRepository.java#L134-L170","documentation":"toEntity converts a YAML model config (m) into a persistence entity, serializing m.defaultParameters to a JSON string with a new ObjectMapper. Any exception during writeValueAsString is wrapped in this IllegalArgumentException. Because the value is a generic Map/List from user-authored YAML, Jackson failures typically indicate a non-serializable value type rather than malformed YAML.","triggerScenarios":"Calling toEntity (via entity()) on a model whose defaultParameters contains objects Jackson cannot serialize, e.g., self-referencing maps or exotic value types loaded from YAML.","commonSituations":"Placing non-JSON-friendly constructs in defaultParameters in the YAML (anchors/aliases creating cyclic references); passing programmatically built Maps containing custom objects without serializers into the config pipeline.","solutions":["Inspect the wrapped cause (e) in the stack trace to identify the exact Jackson failure","Replace problematic values in defaultParameters in the YAML with plain JSON-compatible scalars, lists, and maps","Remove YAML anchors/aliases that could expand to cyclic references; inline the values","If custom types are required, register a suitable Jackson serializer/module instead of the default ObjectMapper"],"exampleFix":"// before\nmodel.defaultParameters = Map.of(\"self\", model.defaultParameters); // cyclic\n// after\nmodel.defaultParameters = Map.of(\"temperature\", 0.7, \"maxTokens\", 2048);","handlingStrategy":"validation","validationCode":"// Java: ensure defaultParameters is JSON-serializable before assignment\nnew ObjectMapper().writeValueAsString(model.getDefaultParameters()); // throws early if not","typeGuard":"boolean isJsonSafe(Object v) {\n    try { new ObjectMapper().writeValueAsString(v); return true; }\n    catch (JsonProcessingException e) { return false; }\n}","tryCatchPattern":"try {\n    entity = toEntity(model);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"defaultParameters\")) {\n        log.error(\"defaultParameters is not JSON-serializable\", e.getCause());\n    }\n}","preventionTips":["Keep defaultParameters limited to JSON-compatible types (maps, lists, scalars)","Avoid YAML anchors/aliases that produce cyclic structures","Reuse a configured shared ObjectMapper and test serialization in unit tests"],"tags":["serialization","jackson","json","model-config"],"backgroundTag":"json-marshal-failed","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}