From 6f9ad31df343a7f1487f90262656b5c78990ff1d Mon Sep 17 00:00:00 2001 From: Philzen Date: Sun, 16 Jun 2024 06:02:53 +0200 Subject: [PATCH] [JAVA-SPRING] Avoid broken code due to duplicate rendering of `@Deprecated` annotation with `generateBuilders=true` (#18917) * Implement regression test for #12804 * Fix duplicate rendering of @Deprecated annotation on Builder methods * Regenerate samples * Sort entries so it's easier to parse if an entry already exists * Add sample that uses generateBuilders=true to test build matrix Serves as an additional regression check for #12804 * Add --no-transfer-progress to mvn build command to increase log legibility --- .../samples-java-client-echo-api-jdk11.yaml | 2 +- .../samples-java-client-echo-api-jdk17.yaml | 2 +- .../samples-java-client-echo-api-jdk8.yaml | 2 +- .../workflows/samples-java-client-jdk11.yaml | 2 +- .../workflows/samples-java-client-jdk17.yaml | 2 +- .../workflows/samples-java-helidon-v3.yaml | 2 +- .../workflows/samples-java-helidon-v4.yaml | 2 +- .../samples-java-play-framework.yaml | 2 +- .../workflows/samples-java-server-jdk8.yaml | 2 +- .github/workflows/samples-java-wiremock.yaml | 2 +- .github/workflows/samples-jaxrs-jdk11.yaml | 2 +- .github/workflows/samples-jaxrs.yaml | 2 +- .github/workflows/samples-jdk17.yaml | 2 +- .github/workflows/samples-jdk21.yaml | 2 +- .github/workflows/samples-spring-jdk17.yaml | 5 ++- .github/workflows/samples-spring.yaml | 36 +++++++++---------- .../resources/JavaSpring/javaBuilder.mustache | 3 -- .../java/spring/SpringCodegenTest.java | 22 ++++++++++++ .../main/java/org/openapitools/model/Pet.java | 1 - .../main/java/org/openapitools/model/Pet.java | 1 - 20 files changed, 58 insertions(+), 38 deletions(-) diff --git a/.github/workflows/samples-java-client-echo-api-jdk11.yaml b/.github/workflows/samples-java-client-echo-api-jdk11.yaml index 96635a4d3f92..5e27029ee358 100644 --- a/.github/workflows/samples-java-client-echo-api-jdk11.yaml +++ b/.github/workflows/samples-java-client-echo-api-jdk11.yaml @@ -43,4 +43,4 @@ jobs: (cd http-echo-server && npm install && npm start &) - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-client-echo-api-jdk17.yaml b/.github/workflows/samples-java-client-echo-api-jdk17.yaml index 3c193ea204f2..670f46195267 100644 --- a/.github/workflows/samples-java-client-echo-api-jdk17.yaml +++ b/.github/workflows/samples-java-client-echo-api-jdk17.yaml @@ -39,4 +39,4 @@ jobs: (cd http-echo-server && npm install && npm start &) - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-client-echo-api-jdk8.yaml b/.github/workflows/samples-java-client-echo-api-jdk8.yaml index 2c5cbb93711e..40deef1c721e 100644 --- a/.github/workflows/samples-java-client-echo-api-jdk8.yaml +++ b/.github/workflows/samples-java-client-echo-api-jdk8.yaml @@ -50,4 +50,4 @@ jobs: (cd http-echo-server && npm install && npm start &) - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-client-jdk11.yaml b/.github/workflows/samples-java-client-jdk11.yaml index 15994e5b7495..6c002712d01b 100644 --- a/.github/workflows/samples-java-client-jdk11.yaml +++ b/.github/workflows/samples-java-client-jdk11.yaml @@ -97,4 +97,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-client-jdk17.yaml b/.github/workflows/samples-java-client-jdk17.yaml index b43fee7981c8..04e261cad6f8 100644 --- a/.github/workflows/samples-java-client-jdk17.yaml +++ b/.github/workflows/samples-java-client-jdk17.yaml @@ -42,7 +42,7 @@ jobs: - name: Build with Maven working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress - name: Cache gradle dependencies uses: actions/cache@v4 diff --git a/.github/workflows/samples-java-helidon-v3.yaml b/.github/workflows/samples-java-helidon-v3.yaml index 7f2bce545c75..976c7f59cb76 100644 --- a/.github/workflows/samples-java-helidon-v3.yaml +++ b/.github/workflows/samples-java-helidon-v3.yaml @@ -38,4 +38,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-helidon-v4.yaml b/.github/workflows/samples-java-helidon-v4.yaml index 3b2bc66ec90f..b13977d4691e 100644 --- a/.github/workflows/samples-java-helidon-v4.yaml +++ b/.github/workflows/samples-java-helidon-v4.yaml @@ -36,4 +36,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-play-framework.yaml b/.github/workflows/samples-java-play-framework.yaml index f4e6d8e8597c..bab74f9d3d00 100644 --- a/.github/workflows/samples-java-play-framework.yaml +++ b/.github/workflows/samples-java-play-framework.yaml @@ -44,4 +44,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-server-jdk8.yaml b/.github/workflows/samples-java-server-jdk8.yaml index 56694212c969..18d7ad222d53 100644 --- a/.github/workflows/samples-java-server-jdk8.yaml +++ b/.github/workflows/samples-java-server-jdk8.yaml @@ -50,4 +50,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-java-wiremock.yaml b/.github/workflows/samples-java-wiremock.yaml index 4398c723236f..7ce358015162 100644 --- a/.github/workflows/samples-java-wiremock.yaml +++ b/.github/workflows/samples-java-wiremock.yaml @@ -32,4 +32,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-jaxrs-jdk11.yaml b/.github/workflows/samples-jaxrs-jdk11.yaml index 0af4e77544a2..a11a93e51342 100644 --- a/.github/workflows/samples-jaxrs-jdk11.yaml +++ b/.github/workflows/samples-jaxrs-jdk11.yaml @@ -33,4 +33,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-jaxrs.yaml b/.github/workflows/samples-jaxrs.yaml index 3e709c111d9d..70f0346045d5 100644 --- a/.github/workflows/samples-jaxrs.yaml +++ b/.github/workflows/samples-jaxrs.yaml @@ -53,4 +53,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-jdk17.yaml b/.github/workflows/samples-jdk17.yaml index f013cd851c0e..b8506febb79c 100644 --- a/.github/workflows/samples-jdk17.yaml +++ b/.github/workflows/samples-jdk17.yaml @@ -63,4 +63,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-jdk21.yaml b/.github/workflows/samples-jdk21.yaml index e09a4485348c..9910b86a0eb5 100644 --- a/.github/workflows/samples-jdk21.yaml +++ b/.github/workflows/samples-jdk21.yaml @@ -40,4 +40,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-spring-jdk17.yaml b/.github/workflows/samples-spring-jdk17.yaml index b78083f4e611..1fe369ec5509 100644 --- a/.github/workflows/samples-spring-jdk17.yaml +++ b/.github/workflows/samples-spring-jdk17.yaml @@ -4,9 +4,11 @@ on: push: paths: - samples/openapi3/client/petstore/spring-cloud-3-with-optional + - samples/openapi3/server/petstore/springboot-3 pull_request: paths: - samples/openapi3/client/petstore/spring-cloud-3-with-optional + - samples/openapi3/server/petstore/springboot-3 - samples/server/petstore/springboot-lombok-data - samples/server/petstore/springboot-lombok-tostring jobs: @@ -20,6 +22,7 @@ jobs: # clients - samples/openapi3/client/petstore/spring-cloud-3-with-optional # servers + - samples/openapi3/server/petstore/springboot-3 - samples/server/petstore/springboot-lombok-data - samples/server/petstore/springboot-lombok-tostring steps: @@ -38,4 +41,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/.github/workflows/samples-spring.yaml b/.github/workflows/samples-spring.yaml index 598b59b163d3..7b114a35ae96 100644 --- a/.github/workflows/samples-spring.yaml +++ b/.github/workflows/samples-spring.yaml @@ -25,40 +25,40 @@ jobs: sample: # clients - samples/client/petstore/spring-cloud - - samples/openapi3/client/petstore/spring-cloud + - samples/client/petstore/spring-cloud-auth - samples/client/petstore/spring-cloud-date-time + - samples/client/petstore/spring-cloud-deprecated + - samples/client/petstore/spring-cloud-tags + - samples/openapi3/client/petstore/spring-cloud + - samples/openapi3/client/petstore/spring-cloud-async - samples/openapi3/client/petstore/spring-cloud-date-time - samples/openapi3/client/petstore/spring-cloud-http-basic + - samples/openapi3/client/petstore/spring-cloud-spring-pageable - samples/openapi3/client/petstore/spring-stubs - samples/openapi3/client/petstore/spring-stubs-skip-default-interface - - samples/openapi3/client/petstore/spring-cloud-async - - samples/openapi3/client/petstore/spring-cloud-spring-pageable - - samples/client/petstore/spring-cloud-tags - - samples/client/petstore/spring-cloud-auth - - samples/client/petstore/spring-cloud-deprecated # servers - - samples/server/petstore/springboot - samples/openapi3/server/petstore/springboot - - samples/server/petstore/springboot-beanvalidation - - samples/server/petstore/springboot-useoptional - - samples/server/petstore/springboot-reactive - - samples/server/petstore/springboot-reactive-noResponseEntity - - samples/server/petstore/springboot-implicitHeaders - samples/openapi3/server/petstore/springboot-implicitHeaders - - samples/server/petstore/springboot-delegate - - samples/server/petstore/springboot-delegate-no-response-entity - samples/openapi3/server/petstore/springboot-delegate + - samples/openapi3/server/petstore/spring-boot-oneof - samples/server/petstore/spring-boot-nullable-set - samples/server/petstore/spring-boot-defaultInterface-unhandledException - - samples/openapi3/server/petstore/spring-boot-oneof - - samples/server/petstore/springboot-virtualan + - samples/server/petstore/springboot + - samples/server/petstore/springboot-beanvalidation + - samples/server/petstore/springboot-delegate + - samples/server/petstore/springboot-delegate-no-response-entity + - samples/server/petstore/springboot-implicitHeaders - samples/server/petstore/springboot-implicitHeaders-annotationLibrary + - samples/server/petstore/springboot-lombok-data + - samples/server/petstore/springboot-reactive + - samples/server/petstore/springboot-reactive-noResponseEntity - samples/server/petstore/springboot-spring-pageable-delegatePattern-without-j8 - samples/server/petstore/springboot-spring-pageable-delegatePattern - samples/server/petstore/springboot-spring-pageable-without-j8 - samples/server/petstore/springboot-spring-pageable - samples/server/petstore/springboot-spring-provide-args - - samples/server/petstore/springboot-lombok-data + - samples/server/petstore/springboot-useoptional + - samples/server/petstore/springboot-virtualan steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -75,4 +75,4 @@ jobs: key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} - name: Build working-directory: ${{ matrix.sample }} - run: mvn clean package + run: mvn clean package --no-transfer-progress diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/javaBuilder.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/javaBuilder.mustache index 9f369e65cfca..c210b33e7fe3 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/javaBuilder.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/javaBuilder.mustache @@ -28,9 +28,6 @@ this.instance.{{name}}({{name}}); return this; } - {{#deprecated}} - @Deprecated - {{/deprecated}} {{#openApiNullable}}{{#isNullable}} public {{classname}}.Builder {{name}}(JsonNullable<{{{datatypeWithEnum}}}> {{name}}) { this.instance.{{name}} = {{name}}; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index e00f2b6bb724..3f233f0273cd 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -4980,4 +4980,26 @@ public void testEnumUnknownDefaultCaseDeserializationNotSet_issue13241() throws .hasAnnotation("JacksonXmlProperty", Map.of("localName", "\"item\"")) .hasAnnotation("JacksonXmlElementWrapper", Map.of("localName", "\"activities-array\"")); } + + /** + * Regression test for #12804 + */ + @Test public void shouldGenerateSingleDeprecatedAnnotation() { + final var tempDir = TestUtils.newTempFolder(); + final CodegenConfigurator configurator = new CodegenConfigurator() + .addAdditionalProperty(GENERATE_BUILDERS, true) + .addGlobalProperty(CodegenConstants.MODELS, "Pet") + .setInputSpec("src/test/resources/3_0/petstore.yaml") + .setGeneratorName("spring") + .setOutputDir(tempDir.toString()); + + new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + + JavaFileAssert.assertThat(tempDir.resolve("src/main/java/org/openapitools/model/Pet.java")) + .assertInnerClass("Builder") + .assertMethod("status").hasAnnotation("Deprecated") + .toInnerClassAssert() + .assertMethod("build") + .doesNotHaveAnnotation("Deprecated"); + } } diff --git a/samples/openapi3/server/petstore/springboot-3/src/main/java/org/openapitools/model/Pet.java b/samples/openapi3/server/petstore/springboot-3/src/main/java/org/openapitools/model/Pet.java index 70282d91a2af..aca357d364e5 100644 --- a/samples/openapi3/server/petstore/springboot-3/src/main/java/org/openapitools/model/Pet.java +++ b/samples/openapi3/server/petstore/springboot-3/src/main/java/org/openapitools/model/Pet.java @@ -368,7 +368,6 @@ public Pet.Builder status(StatusEnum status) { this.instance.status(status); return this; } - @Deprecated /** * returns a built Pet instance. diff --git a/samples/server/petstore/springboot-useoptional/src/main/java/org/openapitools/model/Pet.java b/samples/server/petstore/springboot-useoptional/src/main/java/org/openapitools/model/Pet.java index ab9ee06e6cd9..c5f378449dea 100644 --- a/samples/server/petstore/springboot-useoptional/src/main/java/org/openapitools/model/Pet.java +++ b/samples/server/petstore/springboot-useoptional/src/main/java/org/openapitools/model/Pet.java @@ -337,7 +337,6 @@ public Pet.Builder status(StatusEnum status) { this.instance.status(status); return this; } - @Deprecated /** * returns a built Pet instance.