{"record":{"id":"e8313e05085d31f1","repo":"alibaba/spring-ai-alibaba","slug":"invalid-agent-dsl-data-is-null","errorCode":null,"errorMessage":"invalid agent dsl: data is null","messagePattern":"invalid agent dsl: data is null","errorType":"validation","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/builder/generator/service/dsl/adapters/AgentDSLAdapter.java","lineNumber":125,"sourceCode":"\t\t\t\t\tif (childRoot.get(\"input_keys\") instanceof List<?> ciks) {\n\t\t\t\t\t\tchild.setInputKeys((List<String>) (List<?>) ciks);\n\t\t\t\t\t}\n\t\t\t\t\tchild.setOutputKey(asString(childRoot.get(\"output_key\")));\n\t\t\t\t\tif (childRoot.get(\"handle\") instanceof Map<?, ?> ch) {\n\t\t\t\t\t\tchild.setHandle((Map<String, Object>) ch);\n\t\t\t\t\t}\n\t\t\t\t\tsubs.add(child);\n\t\t\t\t}\n\t\t\t}\n\t\t\tagent.setSubAgents(subs);\n\t\t}\n\n\t\treturn new App(metadata, agent);\n\t}\n\n\tprivate void validateDSLData(Map<String, Object> dslData) {\n\t\tif (dslData == null) {\n\t\t\tthrow new IllegalArgumentException(\"invalid agent dsl: data is null\");\n\t\t}\n\t\tMap<String, Object> root = getAgentRoot(dslData);\n\t\tif (root == null) {\n\t\t\tthrow new IllegalArgumentException(\"invalid agent dsl: missing 'agent' object or flat agent fields\");\n\t\t}\n\t\tString type = firstNonBlank((String) root.get(\"type\"), (String) root.get(\"agent_class\"));\n\t\tString name = (String) root.get(\"name\");\n\t\tif (isBlank(type) || isBlank(name)) {\n\t\t\tthrow new IllegalArgumentException(\"invalid agent dsl: 'type/agent_class' and 'name' are required\");\n\t\t}\n\t\t// 针对不同 Agent 类型的校验\n\t\tvalidateAgentTypeSpecificConstraints(type, root);\n\t}\n\n\tprivate void validateAgentTypeSpecificConstraints(String type, Map<String, Object> root) {\n\t\tif (type == null || root == null) {\n\t\t\treturn;\n\t\t}","sourceCodeStart":107,"sourceCodeEnd":143,"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/builder/generator/service/dsl/adapters/AgentDSLAdapter.java#L107-L143","documentation":"validateDSLData in AgentDSLAdapter rejects a null dslData map at the very start of importDSL — the uploaded/parsed DSL JSON had no data payload, so no agent can be constructed. A fail-fast guard before field validation.","triggerScenarios":"Calling AgentDSLAdapter.importDSL(null) or passing a parse result that came out null (e.g. empty request body deserialized to null).","commonSituations":"Empty request bodies on the import endpoint, serializers returning null for blank input, upstream code dropping the parsed map.","solutions":["Ensure the request body contains a valid agent DSL document","Check that the DSL deserializer is actually invoked and returns a non-null map","Validate the payload is non-empty before calling importDSL"],"exampleFix":"// before\ngateway.parse(body); // returns null for empty body\nagentAdapter.importDSL(parsed);\n// after\nif (parsed != null) { agentAdapter.importDSL(parsed); }\n","handlingStrategy":"validation","validationCode":"if (dslData == null || dslData.isEmpty()) { throw new IllegalArgumentException(\"agent dsl payload required\"); }","typeGuard":"boolean isValidAgentDsl(Map<String,Object> dsl) { return dsl != null && !dsl.isEmpty() && (dsl.containsKey(\"agent\") || !dsl.isEmpty()); }","tryCatchPattern":"try { agentAdapter.importDSL(dsl); } catch (IllegalArgumentException e) { /* return 400 invalid dsl */ }","preventionTips":["Reject empty request bodies before deserialization","Confirm the deserializer never silently returns null","Validate DSL presence at the API layer"],"tags":["null-argument","dsl-import","validation"],"backgroundTag":"null-argument","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"}