{"record":{"id":"45173a43daefccf5","repo":"SonarSource/sonarqube","slug":"invalid-qualifier-available-are","errorCode":null,"errorMessage":"Invalid qualifier, available are: ","messagePattern":"Invalid qualifier, available are: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":400,"severity":"error","filePath":"server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java","lineNumber":301,"sourceCode":"      .favoriteProjectUuids(favoriteProjectUuids)\n      .searchResults(esResults)\n      .analysisByProjectUuid(analysisByProjectUuid)\n      .applicationsLeakPeriods(applicationsLeakPeriod)\n      .query(query)\n      .build();\n  }\n\n  private Set<String> getQualifiersBasedOnEdition(ProjectMeasuresQuery query) {\n    Set<String> availableQualifiers = getQualifiersFromEdition();\n    Set<String> requestQualifiers = query.getQualifiers().orElse(availableQualifiers);\n\n    Set<String> resolvedQualifiers = requestQualifiers.stream()\n      .filter(availableQualifiers::contains)\n      .collect(Collectors.toSet());\n    if (!resolvedQualifiers.isEmpty()) {\n      return resolvedQualifiers;\n    } else {\n      throw new IllegalArgumentException(\"Invalid qualifier, available are: \" + String.join(\",\", availableQualifiers));\n    }\n  }\n\n  private Set<String> getQualifiersFromEdition() {\n    Optional<Edition> edition = editionProvider.get();\n\n    if (edition.isEmpty()) {\n      return Sets.newHashSet(ComponentQualifiers.PROJECT);\n    }\n\n    return switch (edition.get()) {\n      case ENTERPRISE, DATACENTER, DEVELOPER -> Sets.newHashSet(ComponentQualifiers.PROJECT, ComponentQualifiers.APP);\n      default -> Sets.newHashSet(ComponentQualifiers.PROJECT);\n    };\n  }\n\n  private static boolean hasFavoriteFilter(List<Criterion> criteria) {\n    return criteria.stream()","sourceCodeStart":283,"sourceCodeEnd":319,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java#L283-L319","documentation":"The api/projects/search WS validates requested qualifiers against the set available for the current edition (via getQualifiersFromEdition). If none of the requested qualifiers resolve to an available one, getQualifiersBasedOnEdition throws this IllegalArgumentException listing the valid qualifiers.","triggerScenarios":"Calling api/projects/search with a 'qualifiers' parameter whose values do not intersect the edition's available qualifiers (e.g. requesting TRK only when the edition exposes different qualifiers, or misspelling a qualifier like 'TRUNK').","commonSituations":"Community vs commercial edition differences changing the qualifier set; hardcoded qualifiers in scripts/CI jobs written against a different edition; typos in qualifier codes.","solutions":["Use qualifiers from the list appended to the error message (e.g. TRK, APP for the edition in use).","Check the SonarQube edition actually installed and align qualifiers with it.","Fix typos/case in qualifier codes (they are uppercase, e.g. TRK).","Omit the qualifiers parameter to use the endpoint default instead of passing unknown values."],"exampleFix":"// before\nGET /api/projects/search?qualifiers=TRK,VW // VW not available in this edition\n// after\nGET /api/projects/search?qualifiers=TRK","handlingStrategy":"validation","validationCode":"Set<String> available = editionSupportsApplications() ? Set.of(\"TRK\", \"APP\") : Set.of(\"TRK\");\nif (!requestedQualifiers.stream().allMatch(available::contains)) {\n  throw new IllegalArgumentException(\"Unknown qualifiers; use one of \" + available);\n}","typeGuard":null,"tryCatchPattern":"try {\n  response = ws.searchProjects(\"qualifiers=\" + qualifiers);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Invalid qualifier\")) {\n    response = ws.searchProjects(\"\"); // drop qualifiers, use endpoint default\n  } else throw e;\n}","preventionTips":["Fetch valid qualifiers from the error message or edition documentation before querying.","Avoid hardcoding qualifiers in CI scripts; detect the edition at runtime.","Keep qualifier codes uppercase and copy them exactly (e.g. TRK, APP)."],"tags":["java","sonarqube","web-api","qualifiers"],"backgroundTag":"invalid-enum-value","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"}