{"record":{"id":"66a0174a89dda43f","repo":"apache/dubbo","slug":"invalid-configurator-rule-please-specify-at-least","errorCode":null,"errorMessage":"Invalid configurator rule, please specify at least one parameter you want to change in the rule.","messagePattern":"Invalid configurator rule, please specify at least one parameter you want to change in the rule\\.","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java","lineNumber":163,"sourceCode":"                tmpUrlBuilder.append(\"&configVersion=\").append(config.getConfigVersion());\n\n                urls.add(appendMatchCondition(URL.valueOf(tmpUrlBuilder.toString()), item));\n            }\n        }\n        return urls;\n    }\n\n    private static String toParameterString(ConfigItem item) {\n        StringBuilder sb = new StringBuilder();\n        sb.append(\"category=\");\n        sb.append(DYNAMIC_CONFIGURATORS_CATEGORY);\n        if (item.getSide() != null) {\n            sb.append(\"&side=\");\n            sb.append(item.getSide());\n        }\n        Map<String, String> parameters = item.getParameters();\n        if (CollectionUtils.isEmptyMap(parameters)) {\n            throw new IllegalStateException(\"Invalid configurator rule, please specify at least one parameter \"\n                    + \"you want to change in the rule.\");\n        }\n\n        parameters.forEach((k, v) -> {\n            sb.append('&');\n            sb.append(k);\n            sb.append('=');\n            sb.append(v);\n        });\n\n        if (CollectionUtils.isNotEmpty(item.getProviderAddresses())) {\n            sb.append('&');\n            sb.append(OVERRIDE_PROVIDERS_KEY);\n            sb.append('=');\n            sb.append(CollectionUtils.join(item.getProviderAddresses(), \",\"));\n        } else if (PROVIDER.equals(item.getSide())) {\n            sb.append('&');\n            sb.append(OVERRIDE_PROVIDERS_KEY);","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java#L145-L181","documentation":"Thrown by ConfigParser.toParameterString() when a configurator ConfigItem has an empty or null parameters map. Dubbo dynamic configuration (override rules) must specify at least one parameter to change (e.g. timeout, weight, retries). A configurator rule that carries no override keys is invalid and rejected during parsing of the YAML/JSON override config.","triggerScenarios":"Pushing a dynamic configurator rule (override:// config) via the registry/config-center whose config item has side/addresses defined but no actual 'parameters' map (or an empty one). Parsed through ConfigParser.parseConfigurators -> serviceItemToUrls/appItemToUrls -> toParameterString.","commonSituations":"Writing a Dubbo governance rule (dubbo-admin / nacos config) and forgetting the parameters block; providing only 'providerAddresses' or 'side' without specifying what to override; malformed YAML where the parameters map is mis-indented so it parses as null.","solutions":["Add at least one parameter to override in the configurator item, e.g. parameters: { timeout: 2000 } or weight: 200.","Validate the YAML structure: ensure the 'parameters' map is present and correctly indented under each config item before publishing.","If you intend an empty/no-op rule, remove the configurator entry entirely instead of publishing an empty one."],"exampleFix":"# before (broken)\nconfigVersion: v2.7\nconfigs:\n  - items:\n      - side: provider\n        parameters: {}\n\n# after\nconfigVersion: v2.7\nconfigs:\n  - items:\n      - side: provider\n        parameters:\n          timeout: 2000\n          weight: 200","handlingStrategy":"validation","validationCode":"// Validate a ConfigItem before publishing/parsing a configurator rule\nMap<String, String> params = item.getParameters();\nif (item.getSide() == null && CollectionUtils.isEmpty(params)\n        && CollectionUtils.isEmpty(item.getProviderAddresses())) {\n    throw new IllegalArgumentException(\n        \"Refusing to publish configurator: add at least one parameter to override (e.g. timeout, weight).\");\n}\nList<URL> urls = ConfigParser.parseConfigurators(rawConfig);","typeGuard":null,"tryCatchPattern":"try {\n    ConfigParser.parseConfigurators(rawConfig);\n} catch (IllegalStateException e) {\n    // surface a clear governance-config error to the operator\n    throw new ConfigValidationException(\"Configurator rule invalid: \" + e.getMessage()\n        + \" Add parameters: { timeout: 2000 } under the config item.\", e);\n}","preventionTips":["Always include at least one override parameter in every configurator item.","Lint configurator YAML in CI before pushing to the registry/config-center.","Remember side/providerAddresses alone do not satisfy the requirement; parameters are mandatory."],"tags":["config","configurator","governance","validation"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}