{"record":{"id":"bebd4e88e3e1daf9","repo":"alibaba/nacos","slug":"parameter-validate-error-bebd4e","errorCode":"PARAMETER_VALIDATE_ERROR","errorMessage":"Plugin does not support configuration: {pluginId}","messagePattern":"Plugin does not support configuration: (.+?)","errorType":"exception","errorClass":"NacosApiException","httpStatus":400,"severity":"warning","filePath":"core/src/main/java/com/alibaba/nacos/core/plugin/PluginManager.java","lineNumber":317,"sourceCode":"     * @throws NacosApiException if plugin not found or not configurable\n     */\n    public void updatePluginConfig(String pluginId, Map<String, String> config, boolean localOnly)\n        throws NacosApiException {\n        PluginInfo info = pluginRegistry.get(pluginId);\n        if (info == null) {\n            throw new NacosApiException(NacosException.NOT_FOUND, ErrorCode.RESOURCE_NOT_FOUND,\n                \"Plugin not found: \" + pluginId);\n        }\n        \n        try {\n            validateRuntimeChangeSupported(info, \"configuration\");\n        } catch (IllegalArgumentException e) {\n            throw new NacosApiException(NacosException.INVALID_PARAM,\n                ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());\n        }\n        \n        if (!info.isConfigurable()) {\n            throw new NacosApiException(NacosException.INVALID_PARAM,\n                ErrorCode.PARAMETER_VALIDATE_ERROR,\n                \"Plugin does not support configuration: \" + pluginId);\n        }\n        \n        PluginConfigSourceType sourceType = localOnly ? PluginConfigSourceType.LOCAL_ONLY\n            : PluginConfigSourceType.RUNTIME_PERSISTED;\n        Map<String, String> normalizedConfig;\n        try {\n            normalizedConfig = pluginConfigService.prepareRuntimeUpdate(info, config, sourceType);\n        } catch (IllegalArgumentException e) {\n            throw new NacosApiException(NacosException.INVALID_PARAM,\n                ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());\n        } catch (PluginPersistenceException e) {\n            throw new NacosApiException(NacosException.SERVER_ERROR, ErrorCode.SERVER_ERROR, e,\n                e.getMessage());\n        }\n        \n        // LocalOnly mode: only update local memory, skip cluster sync","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/core/src/main/java/com/alibaba/nacos/core/plugin/PluginManager.java#L299-L335","documentation":"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.","triggerScenarios":"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).","commonSituations":"Assuming every plugin supports runtime config; plugin author did not implement/register a PluginConfigService; configuring a built-in minimal plugin that has no knobs.","solutions":["Check PluginDetailVO / the plugin list response for whether the plugin is configurable before calling.","Only call config update on plugins that advertise configurability.","For non-configurable behavior, change startup configuration instead."],"exampleFix":"// before\nPUT /v3/console/plugin/config  {\"pluginType\":\"trace\",\"pluginName\":\"test\",...}\n// after: pick a configurable plugin, or set startup config + restart","handlingStrategy":"validation","validationCode":"PluginDetailVO detail = pluginClient.getDetail(pluginType, pluginName);\nif (!detail.isConfigurable()) {\n    throw new IllegalStateException(pluginType + \":\" + pluginName + \" is not configurable at runtime\");\n}\npluginClient.updateConfig(pluginType, pluginName, config, localOnly);","typeGuard":null,"tryCatchPattern":"try {\n    pluginClient.updateConfig(type, name, config, localOnly);\n} catch (NacosApiException e) {\n    if (e.getErrCode() == 20002 && e.getMessage().contains(\"does not support configuration\")) {\n        // plugin is not configurable -> change startup config instead\n    } else { throw e; }\n}","preventionTips":["Check PluginDetailVO.isConfigurable() before calling config update.","Only runtime-configurable plugins accept config via the API.","For non-configurable plugins, edit startup configuration."],"tags":["plugin","configuration","validation","console-api"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}