From 8129033723fa86c3922c5308f8d50d2ee15a8b7d Mon Sep 17 00:00:00 2001 From: Nikhil Chilwant Date: Thu, 3 Oct 2024 13:12:04 +0200 Subject: [PATCH] Fix #11899: Add ignoreUnknownJacksonAnnotation configuration property --- pom.xml | 2 +- .../IgnoreUnknownJacksonFeatures.java | 10 +++++++ .../generators/java/AbstractJavaCodegen.java | 28 +++++++++++++++++++ .../v3/generators/java/JavaClientCodegen.java | 15 ++++++++-- .../v3/generators/java/SpringCodegen.java | 14 +++++++++- .../Java/libraries/okhttp-gson/pom.mustache | 7 +++++ .../resources/handlebars/Java/pojo.mustache | 4 ++- .../libraries/spring-boot/pom.mustache | 8 +++++- .../libraries/spring-cloud/pom.mustache | 8 +++++- .../libraries/spring-mvc/pom.mustache | 7 +++++ .../handlebars/JavaSpring/pojo.mustache | 2 +- 11 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/main/java/io/swagger/codegen/v3/generators/features/IgnoreUnknownJacksonFeatures.java diff --git a/pom.xml b/pom.xml index a19f6a361e..715f0bc324 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.52 + 1.0.53-SNAPSHOT jar diff --git a/src/main/java/io/swagger/codegen/v3/generators/features/IgnoreUnknownJacksonFeatures.java b/src/main/java/io/swagger/codegen/v3/generators/features/IgnoreUnknownJacksonFeatures.java new file mode 100644 index 0000000000..918aeafef6 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/features/IgnoreUnknownJacksonFeatures.java @@ -0,0 +1,10 @@ +package io.swagger.codegen.v3.generators.features; + +public interface IgnoreUnknownJacksonFeatures { + // Language supports generating JsonIgnoreProperties(ignoreUnknown = true) + String IGNORE_UNKNOWN_JACKSON_ANNOTATION = "ignoreUnknownJacksonAnnotation"; + + void setIgnoreUnknownJacksonAnnotation(boolean ignoreUnknownJacksonAnnotation); + + boolean isIgnoreUnknownJacksonAnnotation(); +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 11dd304657..74c47f7968 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -2,6 +2,7 @@ import static io.swagger.codegen.v3.CodegenConstants.HAS_ENUMS_EXT_NAME; import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME; +import static io.swagger.codegen.v3.generators.features.IgnoreUnknownJacksonFeatures.IGNORE_UNKNOWN_JACKSON_ANNOTATION; import static io.swagger.codegen.v3.generators.features.NotNullAnnotationFeatures.NOT_NULL_JACKSON_ANNOTATION; import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue; @@ -14,6 +15,7 @@ import io.swagger.codegen.v3.CodegenParameter; import io.swagger.codegen.v3.CodegenProperty; import io.swagger.codegen.v3.generators.DefaultCodegenConfig; +import io.swagger.codegen.v3.generators.features.IgnoreUnknownJacksonFeatures; import io.swagger.codegen.v3.generators.features.NotNullAnnotationFeatures; import io.swagger.codegen.v3.generators.handlebars.java.JavaHelper; import io.swagger.codegen.v3.utils.URLPathUtil; @@ -100,6 +102,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegenConfig { protected boolean jakarta = false; private NotNullAnnotationFeatures notNullOption; protected boolean useNullableForNotNull = true; + private IgnoreUnknownJacksonFeatures ignoreUnknown; public AbstractJavaCodegen() { super(); @@ -172,6 +175,10 @@ public AbstractJavaCodegen() { if(this instanceof NotNullAnnotationFeatures){ cliOptions.add(CliOption.newBoolean(NOT_NULL_JACKSON_ANNOTATION, "adds @JsonInclude(JsonInclude.Include.NON_NULL) annotation to model classes")); } + if (this instanceof IgnoreUnknownJacksonFeatures){ + cliOptions.add(CliOption.newBoolean(IGNORE_UNKNOWN_JACKSON_ANNOTATION, + "adds @JsonIgnoreProperties(ignoreUnknown = true) annotation to model classes")); + } CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use"); Map dateOptions = new HashMap(); dateOptions.put("java8", "Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets \"" + JAVA8_MODE + "\" to true"); @@ -394,6 +401,17 @@ public void processOpts() { } } + if (this instanceof IgnoreUnknownJacksonFeatures) { + ignoreUnknown = (IgnoreUnknownJacksonFeatures)this; + if (additionalProperties.containsKey(IGNORE_UNKNOWN_JACKSON_ANNOTATION)) { + ignoreUnknown.setIgnoreUnknownJacksonAnnotation(convertPropertyToBoolean(IGNORE_UNKNOWN_JACKSON_ANNOTATION)); + writePropertyBack(IGNORE_UNKNOWN_JACKSON_ANNOTATION, ignoreUnknown.isIgnoreUnknownJacksonAnnotation()); + if (ignoreUnknown.isIgnoreUnknownJacksonAnnotation()) { + importMapping.put("JsonIgnoreProperties", "com.fasterxml.jackson.annotation.JsonIgnoreProperties"); + } + } + } + if (additionalProperties.containsKey(USE_NULLABLE_FOR_NOTNULL)) { this.setUseNullableForNotnull(Boolean.valueOf(additionalProperties.get(USE_NULLABLE_FOR_NOTNULL).toString())); } @@ -1008,6 +1026,16 @@ public CodegenModel fromModel(String name, Schema schema, Map al } } } + if (this instanceof IgnoreUnknownJacksonFeatures) { + if (this instanceof IgnoreUnknownJacksonFeatures) { + ignoreUnknown = (IgnoreUnknownJacksonFeatures)this; + if (additionalProperties.containsKey(IGNORE_UNKNOWN_JACKSON_ANNOTATION)) { + if (ignoreUnknown.isIgnoreUnknownJacksonAnnotation()) { + codegenModel.imports.add("JsonIgnoreProperties"); + } + } + } + } return codegenModel; } diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java index fbb1481470..1f0923db43 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java @@ -10,6 +10,7 @@ import io.swagger.codegen.v3.SupportingFile; import io.swagger.codegen.v3.generators.features.BeanValidationFeatures; import io.swagger.codegen.v3.generators.features.GzipFeatures; +import io.swagger.codegen.v3.generators.features.IgnoreUnknownJacksonFeatures; import io.swagger.codegen.v3.generators.features.NotNullAnnotationFeatures; import io.swagger.codegen.v3.generators.features.PerformBeanValidationFeatures; import io.swagger.codegen.v3.generators.util.OpenAPIUtil; @@ -33,7 +34,7 @@ import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue; import static java.util.Collections.sort; -public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, PerformBeanValidationFeatures, GzipFeatures, NotNullAnnotationFeatures { +public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, PerformBeanValidationFeatures, GzipFeatures, NotNullAnnotationFeatures, IgnoreUnknownJacksonFeatures { static final String MEDIA_TYPE = "mediaType"; private static final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class); @@ -66,7 +67,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValida protected boolean useGzipFeature = false; protected boolean useRuntimeException = false; private boolean notNullJacksonAnnotation = false; - + private boolean ignoreUnknownJacksonAnnotation = false; public JavaClientCodegen() { super(); @@ -641,4 +642,14 @@ public void setNotNullJacksonAnnotation(boolean notNullJacksonAnnotation) { public boolean isNotNullJacksonAnnotation() { return notNullJacksonAnnotation; } + + @Override + public void setIgnoreUnknownJacksonAnnotation(boolean ignoreUnknownJacksonAnnotation) { + this.ignoreUnknownJacksonAnnotation = ignoreUnknownJacksonAnnotation; + } + + @Override + public boolean isIgnoreUnknownJacksonAnnotation() { + return ignoreUnknownJacksonAnnotation; + } } diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index 968e672084..96cea65055 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -14,6 +14,7 @@ import io.swagger.codegen.v3.CodegenType; import io.swagger.codegen.v3.SupportingFile; import io.swagger.codegen.v3.generators.features.BeanValidationFeatures; +import io.swagger.codegen.v3.generators.features.IgnoreUnknownJacksonFeatures; import io.swagger.codegen.v3.generators.features.NotNullAnnotationFeatures; import io.swagger.codegen.v3.generators.features.OptionalFeatures; import io.swagger.codegen.v3.generators.util.OpenAPIUtil; @@ -45,7 +46,7 @@ import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME; import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue; -public class SpringCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures, NotNullAnnotationFeatures { +public class SpringCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures, NotNullAnnotationFeatures, IgnoreUnknownJacksonFeatures { static Logger LOGGER = LoggerFactory.getLogger(SpringCodegen.class); public static final String DEFAULT_LIBRARY = "spring-boot"; public static final String TITLE = "title"; @@ -98,6 +99,7 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation protected boolean throwsException = false; private boolean notNullJacksonAnnotation = false; protected String validationMode = "strict"; + private boolean ignoreUnknownJacksonAnnotation = false; public SpringCodegen() { super(); @@ -701,6 +703,16 @@ public boolean isNotNullJacksonAnnotation() { return notNullJacksonAnnotation; } + @Override + public void setIgnoreUnknownJacksonAnnotation(boolean ignoreUnknownJacksonAnnotation) { + this.ignoreUnknownJacksonAnnotation = ignoreUnknownJacksonAnnotation; + } + + @Override + public boolean isIgnoreUnknownJacksonAnnotation() { + return ignoreUnknownJacksonAnnotation; + } + private interface DataTypeAssigner { void setReturnType(String returnType); void setReturnContainer(String returnContainer); diff --git a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache index 40141310da..94d024eb1f 100644 --- a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache @@ -206,6 +206,13 @@ 2.10.1 {{/notNullJacksonAnnotation}} + {{#ignoreUnknownJacksonAnnotation}} + + com.fasterxml.jackson.core + jackson-annotations + 2.10.1 + + {{/ignoreUnknownJacksonAnnotation}} com.squareup.okhttp okhttp diff --git a/src/main/resources/handlebars/Java/pojo.mustache b/src/main/resources/handlebars/Java/pojo.mustache index 135b6e6b8f..8a5c835d91 100644 --- a/src/main/resources/handlebars/Java/pojo.mustache +++ b/src/main/resources/handlebars/Java/pojo.mustache @@ -6,7 +6,9 @@ {{#notNullJacksonAnnotation}} @JsonInclude(JsonInclude.Include.NON_NULL) {{/notNullJacksonAnnotation}} - +{{#ignoreUnknownJacksonAnnotation}} +@JsonIgnoreProperties(ignoreUnknown = true) +{{/ignoreUnknownJacksonAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcelableModel}}implements Parcelable {{#serializableModel}}, Serializable {{/serializableModel}}{{#interfaceModels}}{{#@first}}, {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/parcelableModel}}{{^parcelableModel}}{{#serializableModel}}implements Serializable{{#interfaceModels}}{{#@first}}, {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{^serializableModel}}{{#interfaceModels}}{{#@first}}implements {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{/parcelableModel}}{ {{#serializableModel}} private static final long serialVersionUID = 1L; diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache index 1a18ebd250..674e227caf 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache @@ -155,7 +155,13 @@ 2.10.1 {{/notNullJacksonAnnotation}} - + {{#ignoreUnknownJacksonAnnotation}} + + com.fasterxml.jackson.core + jackson-annotations + 2.10.1 + + {{/ignoreUnknownJacksonAnnotation}} {{^useOas2}} org.springframework.plugin diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache index 7a7ca20511..63827c2742 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache @@ -154,7 +154,13 @@ 2.10.1 {{/notNullJacksonAnnotation}} - + {{#ignoreUnknownJacksonAnnotation}} + + com.fasterxml.jackson.core + jackson-annotations + 2.10.1 + + {{/ignoreUnknownJacksonAnnotation}} {{#jakarta}} jakarta.servlet diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache index 5cb1579265..b4cbd545ac 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache @@ -247,6 +247,13 @@ ${jackson-version} {{/notNullJacksonAnnotation}} + {{#ignoreUnknownJacksonAnnotation}} + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + {{/ignoreUnknownJacksonAnnotation}} org.apache.httpcomponents httpclient diff --git a/src/main/resources/handlebars/JavaSpring/pojo.mustache b/src/main/resources/handlebars/JavaSpring/pojo.mustache index f00a0b7406..562b85bae3 100644 --- a/src/main/resources/handlebars/JavaSpring/pojo.mustache +++ b/src/main/resources/handlebars/JavaSpring/pojo.mustache @@ -6,7 +6,7 @@ {{#useBeanValidation}}{{#isStrictValidation}}@NotUndefined{{/isStrictValidation}}{{#isLooseValidation}}@NotUndefined{{/isLooseValidation}}{{/useBeanValidation}} {{>generatedAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{>xmlAnnotation}} {{#notNullJacksonAnnotation}}@JsonInclude(JsonInclude.Include.NON_NULL){{/notNullJacksonAnnotation}} - +{{#ignoreUnknownJacksonAnnotation}}@JsonIgnoreProperties(ignoreUnknown = true){{/ignoreUnknownJacksonAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable {{#interfaceModels}}, {{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{^serializableModel}}{{#interfaceModels}}{{#@first}}implements {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}}{{/@last}}{{/interfaceModels}}{{/serializableModel}} { {{#serializableModel}} private static final long serialVersionUID = 1L;