From 3f4fff51d1f99f73fcd4170240c6565015f22413 Mon Sep 17 00:00:00 2001 From: "Manuel Bl." Date: Fri, 7 Aug 2026 20:05:11 +0200 Subject: [PATCH 1/2] Stable hash for determining if input specification changed --- .../codegen/plugin/CodeGenMojo.java | 19 +++++++++++++++---- .../resttemplate-springBoot4-jackson3/pom.xml | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java index bb06c5de5ad5..3008717749d4 100644 --- a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java +++ b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java @@ -17,11 +17,16 @@ package org.openapitools.codegen.plugin; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.hash.Hashing; import com.google.common.io.Files; import io.swagger.parser.OpenAPIParser; import io.swagger.v3.core.util.Json; +import io.swagger.v3.core.util.Json31; import io.swagger.v3.core.util.Yaml; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.SpecVersion; import io.swagger.v3.parser.OpenAPIResolver; import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.core.models.AuthorizationValue; @@ -1155,10 +1160,16 @@ private String calculateInputSpecHash(String inputSpec) { final URL remoteUrl = inputSpecRemoteUrl(); final List authorizationValues = AuthParser.parse(this.auth); - return Hashing.sha256().hashBytes( - new OpenAPIParser().readLocation(remoteUrl == null ? inputSpec : remoteUrl.toString(), authorizationValues, parseOptions) - .getOpenAPI().toString().getBytes(StandardCharsets.UTF_8) - ).toString(); + final OpenAPI spec = new OpenAPIParser() + .readLocation(remoteUrl == null ? inputSpec : remoteUrl.toString(), authorizationValues, parseOptions) + .getOpenAPI(); + final ObjectMapper mapper = spec.getSpecVersion() == SpecVersion.V30 ? Json.mapper() : Json31.mapper(); + + try { + return Hashing.sha256().hashBytes(mapper.writeValueAsBytes(spec)).toString(); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } /** diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml index b5c5141bdd3d..859141904ec9 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml @@ -269,7 +269,7 @@ UTF-8 - 7.0.8 + 7.0.5 3.1.5 3.0.0 From a1e0eacdc75ec9e72a429c3b62804fa6779f03dd Mon Sep 17 00:00:00 2001 From: "Manuel Bl." Date: Fri, 7 Aug 2026 21:50:08 +0200 Subject: [PATCH 2/2] Handle unparsable input specification --- .../java/org/openapitools/codegen/plugin/CodeGenMojo.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java index 3008717749d4..084fab18b5c4 100644 --- a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java +++ b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java @@ -1163,6 +1163,12 @@ private String calculateInputSpecHash(String inputSpec) { final OpenAPI spec = new OpenAPIParser() .readLocation(remoteUrl == null ? inputSpec : remoteUrl.toString(), authorizationValues, parseOptions) .getOpenAPI(); + + // If the specification is not parsable, a unique string is returned so the subsequent steps are not skipped. + // It is up to them to parse it again and deal with the error. + if (spec == null) + return "INVALID-HASH-" + System.currentTimeMillis(); + final ObjectMapper mapper = spec.getSpecVersion() == SpecVersion.V30 ? Json.mapper() : Json31.mapper(); try {