From a19d455e7eb061d9181fad3ee3764090f4c3f305 Mon Sep 17 00:00:00 2001 From: sijun-yang Date: Fri, 5 Sep 2025 11:23:31 +0900 Subject: [PATCH 1/3] Remove redundant content type validation in tests Signed-off-by: sijun-yang --- .../ProjectMetadataControllerIntegrationTests.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java index 369bd5e7b3..fb4a593754 100644 --- a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java @@ -96,15 +96,13 @@ void metadataWithCurrentAcceptHeader() { "javaVersion.values[0]", "packaging.values[0]", "bootVersion.values[0]", "language.values[0]"); ResponseEntity response = invokeHome(null, "application/vnd.initializr.v2.2+json"); assertThat(response.getHeaders().getFirst(HttpHeaders.ETAG)).isNotNull(); - validateContentType(response, AbstractInitializrIntegrationTests.CURRENT_METADATA_MEDIA_TYPE); - validateMetadata(response.getBody(), "2.2.0"); + validateCurrentMetadata(response); } @Test void metadataWithSeveralVersionsAndQualifier() { ResponseEntity response = invokeHome(null, "application/vnd.initializr.v2+json;q=0.9", "application/vnd.initializr.v2.2+json"); - validateContentType(response, AbstractInitializrIntegrationTests.CURRENT_METADATA_MEDIA_TYPE); validateCurrentMetadata(response); } @@ -112,7 +110,6 @@ void metadataWithSeveralVersionsAndQualifier() { void metadataWithSeveralVersionAndPreferenceOnInvalidVersion() { ResponseEntity response = invokeHome(null, "application/vnd.initializr.v5.4+json", "application/vnd.initializr.v2.2+json;q=0.9"); - validateContentType(response, AbstractInitializrIntegrationTests.CURRENT_METADATA_MEDIA_TYPE); validateCurrentMetadata(response); } From 58e91bebd938ebc761f945320902b7a97d378e2c Mon Sep 17 00:00:00 2001 From: sijun-yang Date: Fri, 5 Sep 2025 13:31:12 +0900 Subject: [PATCH 2/3] Upgrade integration tests to metadata v2.3 Signed-off-by: sijun-yang --- .../web/AbstractInitializrIntegrationTests.java | 4 ++-- ...MetadataControllerCustomDefaultsIntegrationTests.java | 9 ++++++++- .../ProjectMetadataControllerIntegrationTests.java | 9 +++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/initializr-web/src/test/java/io/spring/initializr/web/AbstractInitializrIntegrationTests.java b/initializr-web/src/test/java/io/spring/initializr/web/AbstractInitializrIntegrationTests.java index 52588d4aad..aad0e46695 100755 --- a/initializr-web/src/test/java/io/spring/initializr/web/AbstractInitializrIntegrationTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/AbstractInitializrIntegrationTests.java @@ -72,7 +72,7 @@ public abstract class AbstractInitializrIntegrationTests { protected static final MediaType DEFAULT_METADATA_MEDIA_TYPE = InitializrMetadataVersion.V2_1.getMediaType(); - protected static final MediaType CURRENT_METADATA_MEDIA_TYPE = InitializrMetadataVersion.V2_2.getMediaType(); + protected static final MediaType CURRENT_METADATA_MEDIA_TYPE = InitializrMetadataVersion.V2_3.getMediaType(); private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -133,7 +133,7 @@ protected void validateDefaultMetadata(ResponseEntity response) { protected void validateCurrentMetadata(ResponseEntity response) { validateContentType(response, CURRENT_METADATA_MEDIA_TYPE); - validateMetadata(response.getBody(), "2.2.0"); + validateMetadata(response.getBody(), "2.3.0"); } protected void validateDefaultMetadata(String json) { diff --git a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerCustomDefaultsIntegrationTests.java b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerCustomDefaultsIntegrationTests.java index f7f5146f88..d001852323 100755 --- a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerCustomDefaultsIntegrationTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerCustomDefaultsIntegrationTests.java @@ -20,6 +20,7 @@ import io.spring.initializr.metadata.InitializrMetadataBuilder; import io.spring.initializr.metadata.InitializrMetadataProvider; import io.spring.initializr.web.AbstractFullStackInitializrIntegrationTests; +import io.spring.initializr.web.mapper.InitializrMetadataVersion; import org.json.JSONException; import org.json.JSONObject; import org.junit.jupiter.api.Test; @@ -100,7 +101,13 @@ void dependenciesV21WithNoBootVersion() throws JSONException { @Test void dependenciesV22WithNoBootVersion() throws JSONException { - validateDependenciesMetadata("application/vnd.initializr.v2.2+json", CURRENT_METADATA_MEDIA_TYPE); + validateDependenciesMetadata("application/vnd.initializr.v2.2+json", + InitializrMetadataVersion.V2_2.getMediaType()); + } + + @Test + void dependenciesV23WithNoBootVersion() throws JSONException { + validateDependenciesMetadata("application/vnd.initializr.v2.3+json", CURRENT_METADATA_MEDIA_TYPE); } private void validateDependenciesMetadata(String acceptHeader, MediaType expectedMediaType) throws JSONException { diff --git a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java index fb4a593754..e28b794013 100644 --- a/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java @@ -93,8 +93,9 @@ void metadataWithInvalidPlatformVersion() { @Test void metadataWithCurrentAcceptHeader() { getRequests().setFields("_links.maven-project", "dependencies.values[0]", "type.values[0]", - "javaVersion.values[0]", "packaging.values[0]", "bootVersion.values[0]", "language.values[0]"); - ResponseEntity response = invokeHome(null, "application/vnd.initializr.v2.2+json"); + "javaVersion.values[0]", "packaging.values[0]", "bootVersion.values[0]", "language.values[0]", + "configurationFileFormat.values[0]"); + ResponseEntity response = invokeHome(null, "application/vnd.initializr.v2.3+json"); assertThat(response.getHeaders().getFirst(HttpHeaders.ETAG)).isNotNull(); validateCurrentMetadata(response); } @@ -102,14 +103,14 @@ void metadataWithCurrentAcceptHeader() { @Test void metadataWithSeveralVersionsAndQualifier() { ResponseEntity response = invokeHome(null, "application/vnd.initializr.v2+json;q=0.9", - "application/vnd.initializr.v2.2+json"); + "application/vnd.initializr.v2.3+json"); validateCurrentMetadata(response); } @Test void metadataWithSeveralVersionAndPreferenceOnInvalidVersion() { ResponseEntity response = invokeHome(null, "application/vnd.initializr.v5.4+json", - "application/vnd.initializr.v2.2+json;q=0.9"); + "application/vnd.initializr.v2.3+json;q=0.9"); validateCurrentMetadata(response); } From afe0bbc28318224309623cd17172035e14e42182 Mon Sep 17 00:00:00 2001 From: sijun-yang Date: Fri, 5 Sep 2025 14:10:32 +0900 Subject: [PATCH 3/3] Document configuration file format in metadata Signed-off-by: sijun-yang --- .../main/asciidoc/configuration-guide.adoc | 21 ++++++++++++++++++- .../src/main/asciidoc/metadata-format.adoc | 15 +++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/initializr-docs/src/main/asciidoc/configuration-guide.adoc b/initializr-docs/src/main/asciidoc/configuration-guide.adoc index e61b59ab3a..5a63491a01 100644 --- a/initializr-docs/src/main/asciidoc/configuration-guide.adoc +++ b/initializr-docs/src/main/asciidoc/configuration-guide.adoc @@ -53,7 +53,7 @@ generate assets based on available candidates. A project is defined by `ProjectDescription` which consists of the following properties: * Basic coordinates such as `groupId`, `artifactId`, `name`, `description` -* The `BuildSystem` and `Packaging` +* The `BuildSystem`, `Packaging` and `ConfigurationFileFormat` * The JVM `Language` * The requested dependencies, indexed by ID * A platform `Version` used by the project. This can be used to tune available @@ -341,6 +341,25 @@ NOTE: `Jar` and `War` packaging types are available out-of-the-box. For addition packaging formats, you need to implement the `Packaging` abstraction and provide a `PackagingFactory` that corresponds to it. +Configuration file formats are configurable in the same way as above: + +[source,yaml,indent=0] +---- + initializr: + configuration-file-formats: + - name: Properties + id: properties + default: true + - name: YAML + id: yaml + default: false +---- + +NOTE: `Properties` and `YAML` configuration file formats are supported out-of-the-box. +If you need to support additional configuration formats, you must implement the +`ConfigurationFileFormat` abstraction and provide a `ConfigurationFileFormatFactory` that can +generate it. + [[create-instance-text-only-settings]] diff --git a/initializr-docs/src/main/asciidoc/metadata-format.adoc b/initializr-docs/src/main/asciidoc/metadata-format.adoc index 90387b67c8..34287d46fc 100644 --- a/initializr-docs/src/main/asciidoc/metadata-format.adoc +++ b/initializr-docs/src/main/asciidoc/metadata-format.adoc @@ -14,7 +14,7 @@ sent to the service. A good structure for a user agent is `clientId/clientVersio == Service Capabilities Any third party client can retrieve the capabilities of the service by issuing a `GET` on the root URL using the following `Accept` header: -`application/vnd.initializr.v2.2+json`. Please note that the metadata may evolve in a +`application/vnd.initializr.v2.3+json`. Please note that the metadata may evolve in a non backward compatible way in the future so adding this header ensures the service returns the metadata format you expect. @@ -22,7 +22,8 @@ The following versions are supported: * `v2` initial version, with support of V1 version format only * `v2.1` support compatibility range and dependencies links -* `v2.2` (current) support for V1 and V2 version formats. +* `v2.2` support for V1 and V2 version formats. +* `v2.3` (current) support for selecting the configuration file format. This is an example output for a service running at `start.example.com`: @@ -45,6 +46,8 @@ component responsible to generate the project (for instance, generate an executa _jar_ project). * Java version: the supported java versions * Language: the language to use (e.g. Java) +* Configuration file format: the supported configuration formats for the generated +project (e.g. `application.properties`, `application.yml`) * Boot version: the platform version to use * Additional basic information such as: `groupId`, `artifactId`, `version`, `name`, `description` and `packageName`. @@ -168,6 +171,14 @@ include::{snippets}/metadataWithCurrentAcceptHeader/response-fields/language.val +=== Configuration file format +The `configurationFileFormat` element provides a list of possible configuration file formats for the project: + +.Configuration file format example +include::{snippets}/metadataWithCurrentAcceptHeader/response-fields/configurationFileFormat.values.0.adoc[] + + + === Platform versions The `bootVersion` element provides the list of available platform versions