{"record":{"id":"cf848471bd24ddd9","repo":"alibaba/nacos","slug":"parameter-missing-cf8484","errorCode":"PARAMETER_MISSING","errorMessage":"Request parameter `skillName` should not be blank.","messagePattern":"Request parameter `skillName` should not be blank\\.","errorType":"exception","errorClass":"NacosApiException","httpStatus":400,"severity":"error","filePath":"ai/src/main/java/com/alibaba/nacos/ai/form/skills/admin/SkillBizTagsUpdateForm.java","lineNumber":45,"sourceCode":" * Skill biz tags update form.\n *\n * @author nacos\n */\npublic class SkillBizTagsUpdateForm extends SkillForm {\n    \n    @Serial\n    private static final long serialVersionUID = 1L;\n    \n    /**\n     * JSON string: [\"tag1\",\"tag2\"].\n     */\n    private String bizTags;\n    \n    @Override\n    public void validate() throws NacosApiException {\n        fillDefaultNamespaceId();\n        if (StringUtils.isBlank(getSkillName())) {\n            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,\n                \"Request parameter `skillName` should not be blank.\");\n        }\n    }\n    \n    public String getBizTags() {\n        return bizTags;\n    }\n    \n    public void setBizTags(String bizTags) {\n        this.bizTags = bizTags;\n    }\n}\n","sourceCodeStart":27,"sourceCodeEnd":58,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/form/skills/admin/SkillBizTagsUpdateForm.java#L27-L58","documentation":"SkillBizTagsUpdateForm.validate() requires a non-blank `skillName` before updating a skill's biz tags (comma-separated JSON like [\"tag1\",\"tag2\"]). Biz tags are scoped to a specific skill, so the server must know which skill to patch; a blank skillName is rejected with PARAMETER_MISSING. Note this form uses the looser skillName validation and does NOT require the version field.","triggerScenarios":"Calling the skill biz-tags update API (PUT/POST on the admin skill biz-tags endpoint) with skillName missing, empty, or whitespace-only. The check uses StringUtils.isBlank.","commonSituations":"Frontend sending only the bizTags payload and expecting skillName from a URL path it didn't populate; copy-pasting a skill form that omitted skillName; renaming the field to `name` instead of `skillName`.","solutions":["Include `skillName` in the request matching an existing skill.","If using a REST path like /skills/{skillName}/biz-tags, ensure the path variable is also bound to the form's skillName field.","Verify the skill exists first via the skill list/detail API."],"exampleFix":"// before\n{\"bizTags\":\"[\\\"ai\\\",\\\"prompt\\\"]\"}\n// after\n{\"skillName\":\"my-skill\",\"bizTags\":\"[\\\"ai\\\",\\\"prompt\\\"]\"}","handlingStrategy":"validation","validationCode":"// Before calling skill biz-tags update\nif (skillName == null || skillName.isBlank()) {\n    throw new IllegalArgumentException(\"skillName is required to update biz tags\");\n}","typeGuard":"// TypeScript\nconst hasSkillName = (s?: string | null): boolean =>\n  s != null && s.trim().length > 0;","tryCatchPattern":"try {\n    form.validate();\n} catch (NacosApiException e) {\n    // skillName missing — ensure the URL path variable is bound\n}","preventionTips":["Bind the REST path variable {skillName} to the form field explicitly.","Fetch the skill list to populate a skillName picker in the UI.","Add a client-side guard that blocks submission when skillName is empty."],"tags":["validation","skill-api","required-field","skill-name","metadata"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}