{"record":{"id":"d961377936b51868","repo":"SonarSource/sonarqube","slug":"languages-should-be-set-either-by-using-languages","errorCode":null,"errorMessage":"Languages should be set either by using 'languages = java' or 'languages IN (java, js)'","messagePattern":"Languages should be set either by using 'languages = java' or 'languages IN \\(java, js\\)'","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":400,"severity":"error","filePath":"server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ProjectMeasuresQueryFactory.java","lineNumber":99,"sourceCode":"\n  private static void processIsFavorite(Criterion criterion) {\n    checkArgument(criterion.getOperator() == null && criterion.getValue() == null, \"Filter on favorites should be declared without an operator nor a value\");\n  }\n\n  private static void processLanguages(Criterion criterion, ProjectMeasuresQuery query) {\n    checkOperator(criterion);\n    Operator operator = criterion.getOperator();\n    String value = criterion.getValue();\n    List<String> values = criterion.getValues();\n    if (value != null && EQ.equals(operator)) {\n      query.setLanguages(singleton(value));\n      return;\n    }\n    if (!values.isEmpty() && IN.equals(operator)) {\n      query.setLanguages(new HashSet<>(values));\n      return;\n    }\n    throw new IllegalArgumentException(\"Languages should be set either by using 'languages = java' or 'languages IN (java, js)'\");\n  }\n\n  private static void processTags(Criterion criterion, ProjectMeasuresQuery query) {\n    checkOperator(criterion);\n    Operator operator = criterion.getOperator();\n    String value = criterion.getValue();\n    List<String> values = criterion.getValues();\n    if (value != null && EQ.equals(operator)) {\n      query.setTags(singleton(value));\n      return;\n    }\n    if (!values.isEmpty() && IN.equals(operator)) {\n      query.setTags(new HashSet<>(values));\n      return;\n    }\n    throw new IllegalArgumentException(\"Tags should be set either by using 'tags = java' or 'tags IN (finance, platform)'\");\n  }\n","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ProjectMeasuresQueryFactory.java#L81-L117","documentation":"SonarQube's project measures/search WS only accepts a languages criterion with the '=' or 'IN' operator and at least one value. processLanguages throws this IllegalArgumentException for any other operator (e.g. '!=', '>', missing operator) or when the criterion has no values.","triggerScenarios":"Calling api/measures/search_projects (or similar) with a criteria string like 'languages > java', 'languages != java', 'languages =', or 'languages IN ()'; sending languages with an unsupported operator in a saved filter.","commonSituations":"Typos in operator names in dashboard filters; scripts constructing filters programmatically with the wrong operator; confusion between filter fields that allow other operators.","solutions":["Use 'languages = java' for a single language or 'languages IN (java, js)' for several.","Ensure the criterion includes at least one non-empty value.","Remove or replace any other operator (<, >, !=) applied to the languages criterion."],"exampleFix":"// before\nString criteria = \"languages != java\";\n// after\nString criteria = \"languages IN (java, js)\";","handlingStrategy":"validation","validationCode":"Set<String> allowed = Set.of(\"=\", \"IN\");\nif (criterion.getKey().equals(\"languages\") && (!allowed.contains(criterion.getOperator()) || criterion.getValues().isEmpty())) {\n  throw new IllegalArgumentException(\"languages requires '=' or 'IN' with at least one value\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  response = ws.searchProjects(criteria);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"Languages should be set\")) {\n    criteria = \"languages = \" + languages[0]; // fall back to single-value form\n  } else throw e;\n}","preventionTips":["Only ever generate 'languages = X' or 'languages IN (X, Y)' forms.","Never apply relational operators to language filters.","Validate values are non-empty before joining into the criteria string."],"tags":["java","sonarqube","web-api","query-parameters"],"backgroundTag":"invalid-argument-value","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}