{"record":{"id":"8022c7db2e942f5c","repo":"SonarSource/sonarqube","slug":"parameter-key-not-found-for-action","errorCode":null,"errorMessage":"\"Parameter '\" + key + \"' not found for action '\" + action.key() + \"'\"","messagePattern":"\"Parameter '\" \\+ key \\+ \"' not found for action '\" \\+ action\\.key\\(\\) \\+ \"'\"","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sonar-plugin-api-impl/src/main/java/org/sonar/api/impl/ws/ValidatingRequest.java","lineNumber":88,"sourceCode":"    String rawValue = readParam(key, definition);\n    String rawValueOrDefault = Objects.toString(rawValue, definition.defaultValue());\n    String value = rawValueOrDefault == null ? null : trim(rawValueOrDefault);\n    validateRequiredValue(key, definition, rawValue);\n    if (value == null) {\n      return null;\n    }\n    validatePossibleValues(key, value, definition);\n    validateMaximumLength(key, definition, rawValueOrDefault);\n    validateMinimumLength(key, definition, rawValueOrDefault);\n    validateMaximumValue(key, definition, value);\n    return value;\n  }\n\n  @Override\n  public List<String> multiParam(String key) {\n    WebService.Param definition = action.param(key);\n    if (definition == null) {\n      throw new IllegalArgumentException(\"Parameter '\" + key + \"' not found for action '\" + action.key() + \"'\");\n    }\n    List<String> values = readMultiParamOrDefaultValue(key, definition);\n    return validateValues(values, definition);\n  }\n\n  private static String trim(String s) {\n    int begin;\n    for (begin = 0; begin < s.length(); begin++) {\n      if (!Character.isWhitespace(s.charAt(begin))) {\n        break;\n      }\n    }\n\n    int end;\n    for (end = s.length(); end > begin; end--) {\n      if (!Character.isWhitespace(s.charAt(end - 1))) {\n        break;\n      }","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/sonar-plugin-api-impl/src/main/java/org/sonar/api/impl/ws/ValidatingRequest.java#L70-L106","documentation":"ValidatingRequest.multiParam(key) is a typed accessor for multi-valued web service parameters. It first looks up the parameter in the WebService action's definition; if the action does not declare a parameter with that key, it throws IllegalArgumentException. The library throws this to force plugins to declare their parameters so documentation and validation stay consistent.","triggerScenarios":"Calling request.multiParam(\"some_key\") inside a WebService.SearchRequest implementation where the action never called createParam(...).param(\"some_key\") in define().","commonSituations":"Plugin code reads a parameter that was added on the client/request side but forgotten in the action's define() method; a typo in the key; a parameter declared under a deprecated key that no longer matches.","solutions":["Declare the parameter in the action's define() via createParam(key).... before reading it with multiParam(key).","Fix the key typo so it matches the declared param name.","If reading arbitrary keys is intentional, switch to an untyped read (e.g. request.getMultiParam or the raw request) instead of multiParam."],"exampleFix":"// before\nList<String> values = request.multiParam(\"repositories\");\n\n// after (in the action's define())\npublic void define(WebService.NewAction action) {\n  action.createParam(\"repositories\").setMultiple(true);\n}\n// then in the handler\nList<String> values = request.multiParam(\"repositories\");","handlingStrategy":"validation","validationCode":"// Java\nif (action.param(key) == null) {\n  throw new IllegalStateException(\"Parameter not declared for action: \" + key);\n}\nList<String> values = request.multiParam(key);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Declare every parameter you read in the action's define() method as a first step.","Keep parameter keys in constants shared between define() and the handler.","Review new request.read* calls in code review against the define() parameter list."],"tags":["webservice","request-validation","sonarqube-plugin"],"backgroundTag":"missing-required-argument","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}