alibaba/spring-ai-alibaba · error · InvalidProjectRequestException

Unknown language '${language}' check project metadata

Error message

Unknown language '${language}' check project metadata

What it means

validateLanguage() checks the requested language id (e.g. java, kotlin, groovy) against the languages registered in the Initializr metadata. If the id is unknown, an InvalidProjectRequestException('Unknown language ... check project metadata') is thrown. Only language ids present in metadata.getLanguages() are accepted.

Source

Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/builder/generator/service/generator/GraphProjectReqToDescConverter.java:152

	private void validateType(String type, InitializrMetadata metadata) {
		if (type != null) {
			Type typeFromMetadata = metadata.getTypes().get(type);
			if (typeFromMetadata == null) {
				throw new InvalidProjectRequestException("Unknown type '" + type + "' check project metadata");
			}
			if (!typeFromMetadata.getTags().containsKey("build")) {
				throw new InvalidProjectRequestException(
						"Invalid type '" + type + "' (missing build tag) check project metadata");
			}
		}
	}

	private void validateLanguage(String language, InitializrMetadata metadata) {
		if (language != null) {
			DefaultMetadataElement languageFromMetadata = metadata.getLanguages().get(language);
			if (languageFromMetadata == null) {
				throw new InvalidProjectRequestException("Unknown language '" + language + "' check project metadata");
			}
		}
	}

	private void validatePackaging(String packaging, InitializrMetadata metadata) {
		if (packaging != null) {
			DefaultMetadataElement packagingFromMetadata = metadata.getPackagings().get(packaging);
			if (packagingFromMetadata == null) {
				throw new InvalidProjectRequestException(
						"Unknown packaging '" + packaging + "' check project metadata");
			}
		}
	}

	private void validateDependencies(ProjectRequest request, InitializrMetadata metadata) {
		List<String> dependencies = request.getDependencies();
		dependencies.forEach((dep) -> {
			Dependency dependency = metadata.getDependencies().get(dep);

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Use a registered language id such as 'java' or 'kotlin' (list valid ids from the metadata endpoint)
  2. Register the additional language in initializr.metadata languages configuration
  3. Fix the typo in the request

Example fix

// before
request.setLanguage("jva");
// after
request.setLanguage("java");
Defensive patterns

Strategy: validation

Validate before calling

if (language != null && !Set.of("java","kotlin","groovy").contains(language)) {
    throw new IllegalArgumentException("language '" + language + "' not registered");
}

Try / catch

try {
    converter.validate(request);
} catch (InvalidProjectRequestException e) {
    return ResponseEntity.badRequest().body(e.getMessage());
}

Prevention

When it happens

Trigger: Calling validate/convert with ProjectRequest language set to an id not found via metadata.getLanguages().get(language) — e.g. language 'scala' or a typo like 'jva'.

Common situations: Typos in the language parameter, requesting a language the admin generator metadata does not register, stale clients sending removed language ids.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/c1376dac7515eb26. Report an issue: GitHub.