alibaba/nacos · error · NacosApiException

PARAMETER_MISSING

PARAMETER_MISSING

Error message

Required parameter 'skillName' type String is not present

What it means

SkillForm.validate() is the base-class guard shared by most skill admin forms. It fills the default namespaceId ("public") then requires a non-empty `skillName`. Almost every skill operation is keyed by skillName, so this is the most frequently hit skill validation. The check uses StringUtils.isEmpty (null or empty-string fail; whitespace-only would pass this check but later ops typically trim).

Source

Thrown at ai/src/main/java/com/alibaba/nacos/ai/form/skills/admin/SkillForm.java:48

 *
 * @author nacos
 */
public class SkillForm implements NacosForm {
    
    @Serial
    private static final long serialVersionUID = 1L;
    
    private String namespaceId;
    
    private String skillName;
    
    private String version;
    
    @Override
    public void validate() throws NacosApiException {
        fillDefaultNamespaceId();
        if (StringUtils.isEmpty(skillName)) {
            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,
                "Required parameter 'skillName' type String is not present");
        }
    }
    
    protected void fillDefaultNamespaceId() {
        if (StringUtils.isEmpty(namespaceId)) {
            namespaceId = Constants.Skills.SKILL_DEFAULT_NAMESPACE;
        }
    }
    
    public String getNamespaceId() {
        return namespaceId;
    }
    
    public void setNamespaceId(String namespaceId) {
        this.namespaceId = namespaceId;
    }
    

View on GitHub (pinned to 9b989acdf1)

Solutions

  1. Provide a non-empty `skillName` in the request.
  2. Confirm the skill exists via the list API to get its exact name.
  3. Check that the HTTP parameter name is `skillName` (camelCase) and is correctly bound to the form field.

Example fix

// before
GET /v3/admin/ai/skills/?skillName=
// after
GET /v3/admin/ai/skills/?skillName=my-skill
Defensive patterns

Strategy: validation

Validate before calling

// Base check for any SkillForm subclass
if (skillName == null || skillName.isEmpty()) {
    throw new IllegalArgumentException("skillName is required");
}

Type guard

// TypeScript
const hasSkillName = (s?: string | null): boolean =>
  s != null && s.length > 0;

Try / catch

try {
    form.validate();
} catch (NacosApiException e) {
    // skillName missing — populate from the request path/body
}

Prevention

When it happens

Trigger: Calling any skill admin API whose form extends SkillForm (delete, get, publish, online, etc.) with skillName missing or empty. Because subclasses call super.validate(), this fires first for many operations.

Common situations: URL like /skills/ with an empty path variable; frontend sending skillId instead of skillName; form binding that didn't map the request param to the skillName setter; whitespace-only names that later get trimmed elsewhere.

Related errors


AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14). Data as JSON: /api/errors/1cf0192b5e5a77b9. Report an issue: GitHub.