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 syncView on GitHub (pinned to 9b989acdf1)
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.
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
- Check PluginDetailVO.isConfigurable() before calling config update.
- Only runtime-configurable plugins accept config via the API.
- For non-configurable plugins, edit startup configuration.
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.