From a743635597bd1dae58856b7a123b8bb2245b2e4d Mon Sep 17 00:00:00 2001 From: JorrenH Date: Tue, 3 Jun 2025 12:00:52 +0200 Subject: [PATCH 1/2] [Java][Native] Fix POJO with additionalProperties to not extend HashMap --- .../openapitools/codegen/languages/JavaClientCodegen.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index 735f27aacd6f..1ef85fe8f918 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -615,6 +615,13 @@ public void processOpts() { supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); supportingFiles.add(new SupportingFile("AbstractOpenApiSchema.mustache", modelsFolder, "AbstractOpenApiSchema.java")); forceSerializationLibrary(SERIALIZATION_LIBRARY_JACKSON); + + // Composed schemas can have the 'additionalProperties' keyword, as specified in JSON schema. + // In principle, this should be enabled by default for all code generators. However due to limitations + // in other code generators, support needs to be enabled on a case-by-case basis. + // The flag below should be set for all Java libraries, but the templates need to be ported + // one by one for each library. + supportsAdditionalPropertiesWithComposedSchema = true; } else if (libRestEasy) { supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); forceSerializationLibrary(SERIALIZATION_LIBRARY_JACKSON); From 202eb8bdf4b54de04918667d193bdbe6d2302a87 Mon Sep 17 00:00:00 2001 From: JorrenH Date: Tue, 3 Jun 2025 12:13:19 +0200 Subject: [PATCH 2/2] [Java][Native] Update samples to remove HashMap extension --- .../java/org/openapitools/client/model/Drawing.java | 10 +++------- .../org/openapitools/client/model/NullableClass.java | 8 +++----- .../TestInlineFreeformAdditionalPropertiesRequest.java | 10 +++------- .../main/java/org/openapitools/client/model/Zebra.java | 10 +++------- .../java/org/openapitools/client/model/Drawing.java | 5 +---- .../org/openapitools/client/model/NullableClass.java | 3 +-- .../TestInlineFreeformAdditionalPropertiesRequest.java | 5 +---- .../main/java/org/openapitools/client/model/Zebra.java | 5 +---- 8 files changed, 16 insertions(+), 40 deletions(-) diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Drawing.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Drawing.java index cd139b4b7720..7cd9d78e6265 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Drawing.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Drawing.java @@ -30,9 +30,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.openapitools.client.model.Fruit; import org.openapitools.client.model.NullableShape; import org.openapitools.client.model.Shape; @@ -55,7 +53,7 @@ Drawing.JSON_PROPERTY_SHAPES }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class Drawing extends HashMap { +public class Drawing { public static final String JSON_PROPERTY_MAIN_SHAPE = "mainShape"; @javax.annotation.Nullable private Shape mainShape; @@ -245,8 +243,7 @@ public boolean equals(Object o) { Objects.equals(this.shapeOrNull, drawing.shapeOrNull) && equalsNullable(this.nullableShape, drawing.nullableShape) && Objects.equals(this.shapes, drawing.shapes)&& - Objects.equals(this.additionalProperties, drawing.additionalProperties) && - super.equals(o); + Objects.equals(this.additionalProperties, drawing.additionalProperties); } private static boolean equalsNullable(JsonNullable a, JsonNullable b) { @@ -255,7 +252,7 @@ private static boolean equalsNullable(JsonNullable a, JsonNullable b) @Override public int hashCode() { - return Objects.hash(mainShape, shapeOrNull, hashCodeNullable(nullableShape), shapes, super.hashCode(), additionalProperties); + return Objects.hash(mainShape, shapeOrNull, hashCodeNullable(nullableShape), shapes, additionalProperties); } private static int hashCodeNullable(JsonNullable a) { @@ -269,7 +266,6 @@ private static int hashCodeNullable(JsonNullable a) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Drawing {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" mainShape: ").append(toIndentedString(mainShape)).append("\n"); sb.append(" shapeOrNull: ").append(toIndentedString(shapeOrNull)).append("\n"); sb.append(" nullableShape: ").append(toIndentedString(nullableShape)).append("\n"); diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/NullableClass.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/NullableClass.java index 2767da71967b..feb89ea674d6 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/NullableClass.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/NullableClass.java @@ -62,7 +62,7 @@ NullableClass.JSON_PROPERTY_OBJECT_ITEMS_NULLABLE }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class NullableClass extends HashMap { +public class NullableClass { public static final String JSON_PROPERTY_INTEGER_PROP = "integer_prop"; private JsonNullable integerProp = JsonNullable.undefined(); @@ -603,8 +603,7 @@ public boolean equals(Object o) { equalsNullable(this.objectNullableProp, nullableClass.objectNullableProp) && equalsNullable(this.objectAndItemsNullableProp, nullableClass.objectAndItemsNullableProp) && Objects.equals(this.objectItemsNullable, nullableClass.objectItemsNullable)&& - Objects.equals(this.additionalProperties, nullableClass.additionalProperties) && - super.equals(o); + Objects.equals(this.additionalProperties, nullableClass.additionalProperties); } private static boolean equalsNullable(JsonNullable a, JsonNullable b) { @@ -613,7 +612,7 @@ private static boolean equalsNullable(JsonNullable a, JsonNullable b) @Override public int hashCode() { - return Objects.hash(hashCodeNullable(integerProp), hashCodeNullable(numberProp), hashCodeNullable(booleanProp), hashCodeNullable(stringProp), hashCodeNullable(dateProp), hashCodeNullable(datetimeProp), hashCodeNullable(arrayNullableProp), hashCodeNullable(arrayAndItemsNullableProp), arrayItemsNullable, hashCodeNullable(objectNullableProp), hashCodeNullable(objectAndItemsNullableProp), objectItemsNullable, super.hashCode(), additionalProperties); + return Objects.hash(hashCodeNullable(integerProp), hashCodeNullable(numberProp), hashCodeNullable(booleanProp), hashCodeNullable(stringProp), hashCodeNullable(dateProp), hashCodeNullable(datetimeProp), hashCodeNullable(arrayNullableProp), hashCodeNullable(arrayAndItemsNullableProp), arrayItemsNullable, hashCodeNullable(objectNullableProp), hashCodeNullable(objectAndItemsNullableProp), objectItemsNullable, additionalProperties); } private static int hashCodeNullable(JsonNullable a) { @@ -627,7 +626,6 @@ private static int hashCodeNullable(JsonNullable a) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class NullableClass {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" integerProp: ").append(toIndentedString(integerProp)).append("\n"); sb.append(" numberProp: ").append(toIndentedString(numberProp)).append("\n"); sb.append(" booleanProp: ").append(toIndentedString(booleanProp)).append("\n"); diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java index a0d8471aee7a..87252f2d4c2f 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java @@ -29,8 +29,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -42,7 +40,7 @@ TestInlineFreeformAdditionalPropertiesRequest.JSON_PROPERTY_SOME_PROPERTY }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class TestInlineFreeformAdditionalPropertiesRequest extends HashMap { +public class TestInlineFreeformAdditionalPropertiesRequest { public static final String JSON_PROPERTY_SOME_PROPERTY = "someProperty"; @javax.annotation.Nullable private String someProperty; @@ -130,20 +128,18 @@ public boolean equals(Object o) { } TestInlineFreeformAdditionalPropertiesRequest testInlineFreeformAdditionalPropertiesRequest = (TestInlineFreeformAdditionalPropertiesRequest) o; return Objects.equals(this.someProperty, testInlineFreeformAdditionalPropertiesRequest.someProperty)&& - Objects.equals(this.additionalProperties, testInlineFreeformAdditionalPropertiesRequest.additionalProperties) && - super.equals(o); + Objects.equals(this.additionalProperties, testInlineFreeformAdditionalPropertiesRequest.additionalProperties); } @Override public int hashCode() { - return Objects.hash(someProperty, super.hashCode(), additionalProperties); + return Objects.hash(someProperty, additionalProperties); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class TestInlineFreeformAdditionalPropertiesRequest {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" someProperty: ").append(toIndentedString(someProperty)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); sb.append("}"); diff --git a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Zebra.java b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Zebra.java index 7fcef298604c..215d8d17af17 100644 --- a/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Zebra.java +++ b/samples/client/petstore/java/native-async/src/main/java/org/openapitools/client/model/Zebra.java @@ -29,8 +29,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -43,7 +41,7 @@ Zebra.JSON_PROPERTY_CLASS_NAME }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class Zebra extends HashMap { +public class Zebra { /** * Gets or Sets type */ @@ -197,20 +195,18 @@ public boolean equals(Object o) { Zebra zebra = (Zebra) o; return Objects.equals(this.type, zebra.type) && Objects.equals(this.className, zebra.className)&& - Objects.equals(this.additionalProperties, zebra.additionalProperties) && - super.equals(o); + Objects.equals(this.additionalProperties, zebra.additionalProperties); } @Override public int hashCode() { - return Objects.hash(type, className, super.hashCode(), additionalProperties); + return Objects.hash(type, className, additionalProperties); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Zebra {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" type: ").append(toIndentedString(type)).append("\n"); sb.append(" className: ").append(toIndentedString(className)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Drawing.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Drawing.java index 056209eef855..25c848d3a5e6 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Drawing.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Drawing.java @@ -32,9 +32,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.openapitools.client.model.Fruit; import org.openapitools.client.model.NullableShape; import org.openapitools.client.model.Shape; @@ -57,7 +55,7 @@ Drawing.JSON_PROPERTY_SHAPES }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class Drawing extends HashMap { +public class Drawing { public static final String JSON_PROPERTY_MAIN_SHAPE = "mainShape"; @javax.annotation.Nullable private Shape mainShape; @@ -259,7 +257,6 @@ private static int hashCodeNullable(JsonNullable a) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Drawing {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" mainShape: ").append(toIndentedString(mainShape)).append("\n"); sb.append(" shapeOrNull: ").append(toIndentedString(shapeOrNull)).append("\n"); sb.append(" nullableShape: ").append(toIndentedString(nullableShape)).append("\n"); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/NullableClass.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/NullableClass.java index bc46f6a1eeb8..d4f4cafc74dd 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/NullableClass.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/NullableClass.java @@ -64,7 +64,7 @@ NullableClass.JSON_PROPERTY_OBJECT_ITEMS_NULLABLE }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class NullableClass extends HashMap { +public class NullableClass { public static final String JSON_PROPERTY_INTEGER_PROP = "integer_prop"; private JsonNullable integerProp = JsonNullable.undefined(); @@ -609,7 +609,6 @@ private static int hashCodeNullable(JsonNullable a) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class NullableClass {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" integerProp: ").append(toIndentedString(integerProp)).append("\n"); sb.append(" numberProp: ").append(toIndentedString(numberProp)).append("\n"); sb.append(" booleanProp: ").append(toIndentedString(booleanProp)).append("\n"); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java index 31ce5361ce23..36633e508e99 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/TestInlineFreeformAdditionalPropertiesRequest.java @@ -31,8 +31,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -44,7 +42,7 @@ TestInlineFreeformAdditionalPropertiesRequest.JSON_PROPERTY_SOME_PROPERTY }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class TestInlineFreeformAdditionalPropertiesRequest extends HashMap { +public class TestInlineFreeformAdditionalPropertiesRequest { public static final String JSON_PROPERTY_SOME_PROPERTY = "someProperty"; @javax.annotation.Nullable private String someProperty; @@ -136,7 +134,6 @@ public int hashCode() { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class TestInlineFreeformAdditionalPropertiesRequest {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" someProperty: ").append(toIndentedString(someProperty)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); sb.append("}"); diff --git a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Zebra.java b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Zebra.java index 9de95e384437..e88e96b114eb 100644 --- a/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Zebra.java +++ b/samples/client/petstore/java/native/src/main/java/org/openapitools/client/model/Zebra.java @@ -31,8 +31,6 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -45,7 +43,7 @@ Zebra.JSON_PROPERTY_CLASS_NAME }) @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0-SNAPSHOT") -public class Zebra extends HashMap { +public class Zebra { /** * Gets or Sets type */ @@ -202,7 +200,6 @@ public int hashCode() { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Zebra {\n"); - sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" type: ").append(toIndentedString(type)).append("\n"); sb.append(" className: ").append(toIndentedString(className)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");