diff --git a/docs/generators/spring.md b/docs/generators/spring.md
index e981672bff32..a7ab9d252d76 100644
--- a/docs/generators/spring.md
+++ b/docs/generators/spring.md
@@ -34,6 +34,7 @@ sidebar_label: spring
|interfaceOnly|Whether to generate only API interface stubs without the server files.| |false|
|invokerPackage|root package for generated code| |org.openapitools.api|
|java8|Option. Use Java8 classes instead of third party equivalents|
- **true**
- Use Java 8 classes such as Base64. Use java8 default interface when a responseWrapper is used
- **false**
- Various third party libraries as needed
|false|
+|keepDiscriminatorProperty|if false the discriminator properties are deleted from model, even if they are defined - this option set `visible` into `@JsonTypeInfo`| |true|
|library|library template (sub-template)|- **spring-boot**
- Spring-boot Server application using the SpringFox integration.
- **spring-mvc**
- Spring-MVC Server application using the SpringFox integration.
- **spring-cloud**
- Spring-Cloud-Feign client with Spring-Boot auto-configured settings.
|spring-boot|
|licenseName|The name of the license| |Unlicense|
|licenseUrl|The URL of the license| |http://unlicense.org|
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java
index 8450fbd5f4de..9d6f4c7375fb 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java
@@ -18,9 +18,12 @@
package org.openapitools.codegen.languages;
import com.samskivert.mustache.Mustache;
+import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
+import io.swagger.v3.oas.models.media.Discriminator;
+import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.tuple.Pair;
import org.openapitools.codegen.*;
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
@@ -52,6 +55,7 @@ public class SpringCodegen extends AbstractJavaCodegen
public static final String CONFIG_PACKAGE = "configPackage";
public static final String BASE_PACKAGE = "basePackage";
public static final String INTERFACE_ONLY = "interfaceOnly";
+ public static final String KEEP_DISCRIMINATOR_PROPERTY = "keepDiscriminatorProperty";
public static final String DELEGATE_PATTERN = "delegatePattern";
public static final String SINGLE_CONTENT_TYPES = "singleContentTypes";
public static final String VIRTUAL_SERVICE = "virtualService";
@@ -98,6 +102,7 @@ public class SpringCodegen extends AbstractJavaCodegen
protected boolean hateoas = false;
protected boolean returnSuccessCode = false;
protected boolean unhandledException = false;
+ protected boolean keepDiscriminatorProperty = true;
public SpringCodegen() {
super();
@@ -171,6 +176,7 @@ public SpringCodegen() {
cliOptions.add(CliOption.newBoolean(HATEOAS, "Use Spring HATEOAS library to allow adding HATEOAS links", hateoas));
cliOptions.add(CliOption.newBoolean(RETURN_SUCCESS_CODE, "Generated server returns 2xx code", returnSuccessCode));
cliOptions.add(CliOption.newBoolean(UNHANDLED_EXCEPTION_HANDLING, "Declare operation methods to throw a generic exception and allow unhandled exceptions (useful for Spring `@ControllerAdvice` directives).", unhandledException));
+ cliOptions.add(CliOption.newBoolean(KEEP_DISCRIMINATOR_PROPERTY, "if false the discriminator properties are deleted from model, even if they are defined", keepDiscriminatorProperty));
supportedLibraries.put(SPRING_BOOT, "Spring-boot Server application using the SpringFox integration.");
supportedLibraries.put(SPRING_MVC_LIBRARY, "Spring-MVC Server application using the SpringFox integration.");
@@ -327,6 +333,12 @@ public void processOpts() {
this.setHateoas(Boolean.valueOf(additionalProperties.get(HATEOAS).toString()));
}
+ if (additionalProperties.containsKey(KEEP_DISCRIMINATOR_PROPERTY)) {
+ this.setKeepDiscriminatorProperty(Boolean.valueOf(additionalProperties.get(KEEP_DISCRIMINATOR_PROPERTY).toString()));
+ } else {
+ additionalProperties.put(KEEP_DISCRIMINATOR_PROPERTY, this.isKeepDiscriminatorProperty());
+ }
+
if (additionalProperties.containsKey(RETURN_SUCCESS_CODE)) {
this.setReturnSuccessCode(Boolean.valueOf(additionalProperties.get(RETURN_SUCCESS_CODE).toString()));
}
@@ -579,6 +591,27 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
}
}
}
+
+ Components components = openAPI.getComponents();
+ if (!isKeepDiscriminatorProperty() && components != null) {
+ Map schemas = components.getSchemas();
+ if (schemas != null) {
+ for (Schema schema : schemas.values()) {
+ Discriminator discriminator = schema.getDiscriminator();
+ if (discriminator != null) {
+ String propertyName = discriminator.getPropertyName();
+ List required = schema.getRequired();
+ if (required != null) {
+ required.remove(propertyName);
+ }
+ Map properties = schema.getProperties();
+ if (properties != null) {
+ properties.remove(propertyName);
+ }
+ }
+ }
+ }
+ }
}
@Override
@@ -812,6 +845,14 @@ public void setHateoas(boolean hateoas) {
this.hateoas = hateoas;
}
+ public void setKeepDiscriminatorProperty(final boolean keepDiscriminatorProperty) {
+ this.keepDiscriminatorProperty = keepDiscriminatorProperty;
+ }
+
+ public boolean isKeepDiscriminatorProperty() {
+ return keepDiscriminatorProperty;
+ }
+
public void setReturnSuccessCode(boolean returnSuccessCode) {
this.returnSuccessCode = returnSuccessCode;
}
diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache
index 81c2ba05f903..634b55877b7b 100644
--- a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache
+++ b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache
@@ -1,6 +1,6 @@
{{#jackson}}
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = {{{keepDiscriminatorProperty}}})
@JsonSubTypes({
{{#discriminator.mappedModels}}
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),