alibaba/nacos · warning · NacosApiException

PARAMETER_VALIDATE_ERROR

PARAMETER_VALIDATE_ERROR

Error message

Plugin does not support configuration: {pluginId}

What it means

PluginManager.updatePluginConfig throws NacosApiException(HTTP 400, ErrorCode.PARAMETER_VALIDATE_ERROR 20002) "Plugin does not support configuration" when the plugin exists but PluginInfo.isConfigurable() is false — the plugin type/instance does not implement runtime config updates. Exposed via PUT /v3/console/plugin/config.

Source

Thrown at core/src/main/java/com/alibaba/nacos/core/plugin/PluginManager.java:317

     * @throws NacosApiException if plugin not found or not configurable
     */
    public void updatePluginConfig(String pluginId, Map<String, String> config, boolean localOnly)
        throws NacosApiException {
        PluginInfo info = pluginRegistry.get(pluginId);
        if (info == null) {
            throw new NacosApiException(NacosException.NOT_FOUND, ErrorCode.RESOURCE_NOT_FOUND,
                "Plugin not found: " + pluginId);
        }
        
        try {
            validateRuntimeChangeSupported(info, "configuration");
        } catch (IllegalArgumentException e) {
            throw new NacosApiException(NacosException.INVALID_PARAM,
                ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
        }
        
        if (!info.isConfigurable()) {
            throw new NacosApiException(NacosException.INVALID_PARAM,
                ErrorCode.PARAMETER_VALIDATE_ERROR,
                "Plugin does not support configuration: " + pluginId);
        }
        
        PluginConfigSourceType sourceType = localOnly ? PluginConfigSourceType.LOCAL_ONLY
            : PluginConfigSourceType.RUNTIME_PERSISTED;
        Map<String, String> normalizedConfig;
        try {
            normalizedConfig = pluginConfigService.prepareRuntimeUpdate(info, config, sourceType);
        } catch (IllegalArgumentException e) {
            throw new NacosApiException(NacosException.INVALID_PARAM,
                ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
        } catch (PluginPersistenceException e) {
            throw new NacosApiException(NacosException.SERVER_ERROR, ErrorCode.SERVER_ERROR, e,
                e.getMessage());
        }
        
        // LocalOnly mode: only update local memory, skip cluster sync

View on GitHub (pinned to 9b989acdf1)

Solutions

  1. Check PluginDetailVO / the plugin list response for whether the plugin is configurable before calling.
  2. Only call config update on plugins that advertise configurability.
  3. For non-configurable behavior, change startup configuration instead.

Example fix

// before
PUT /v3/console/plugin/config  {"pluginType":"trace","pluginName":"test",...}
// after: pick a configurable plugin, or set startup config + restart
Defensive patterns

Strategy: validation

Validate before calling

PluginDetailVO detail = pluginClient.getDetail(pluginType, pluginName);
if (!detail.isConfigurable()) {
    throw new IllegalStateException(pluginType + ":" + pluginName + " is not configurable at runtime");
}
pluginClient.updateConfig(pluginType, pluginName, config, localOnly);

Try / catch

try {
    pluginClient.updateConfig(type, name, config, localOnly);
} catch (NacosApiException e) {
    if (e.getErrCode() == 20002 && e.getMessage().contains("does not support configuration")) {
        // plugin is not configurable -> change startup config instead
    } else { throw e; }
}

Prevention

When it happens

Trigger: Calling PUT /v3/console/plugin/config on a plugin whose type has no config schema or whose PluginConfigService is not registered (e.g. a plain trace plugin variant).

Common situations: Assuming every plugin supports runtime config; plugin author did not implement/register a PluginConfigService; configuring a built-in minimal plugin that has no knobs.

Related errors


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