diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java index 661f5e2dcf5..62aa1f22b8b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java @@ -31,7 +31,7 @@ public class CodegenParameter { public String example; // example value (x-example) public String jsonSchema; - public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid; + public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isEmail; public boolean isListContainer, isMapContainer; public boolean isFile; public boolean isEnum; @@ -166,6 +166,7 @@ public class CodegenParameter { output.isDate = this.isDate; output.isDateTime = this.isDateTime; output.isUuid = this.isUuid; + output.isEmail = this.isEmail; output.isListContainer = this.isListContainer; output.isMapContainer = this.isMapContainer; @@ -256,6 +257,8 @@ public class CodegenParameter { return false; if (isUuid != that.isUuid) return false; + if (isEmail != that.isEmail) + return false; if (isListContainer != that.isListContainer) return false; if (isMapContainer != that.isMapContainer) @@ -342,6 +345,7 @@ public class CodegenParameter { result = 31 * result + (isDate ? 13:31); result = 31 * result + (isDateTime ? 13:31); result = 31 * result + (isUuid ? 13:31); + result = 31 * result + (isEmail ? 13:31); result = 31 * result + (isListContainer ? 13:31); result = 31 * result + (isMapContainer ? 13:31); result = 31 * result + (isFile ? 13:31); @@ -409,6 +413,7 @@ public class CodegenParameter { ", isDate=" + isDate + ", isDateTime=" + isDateTime + ", isUuid=" + isUuid + + ", isEmail=" + isEmail + ", isListContainer=" + isListContainer + ", isMapContainer=" + isMapContainer + ", isFile=" + isFile + diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java index fd3e27988ec..3fa796d45f2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java @@ -56,7 +56,7 @@ public class CodegenProperty implements Cloneable { public boolean hasMore, required, secondaryParam; public boolean hasMoreNonReadOnly; // for model constructor, true if next property is not readonly public boolean isPrimitiveType, isModel, isContainer, isNotContainer; - public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isFile, isBoolean, isDate, isDateTime, isUuid; + public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isFile, isBoolean, isDate, isDateTime, isUuid, isEmail; public boolean isListContainer, isMapContainer; public boolean isEnum; public boolean isReadOnly; @@ -473,6 +473,7 @@ public class CodegenProperty implements Cloneable { result = prime * result + ((isDate ? 13:31)); result = prime * result + ((isDateTime ? 13:31)); result = prime * result + ((isUuid ? 13:31)); + result = prime * result + ((isEmail ? 13:31)); result = prime * result + ((isMapContainer ? 13:31)); result = prime * result + ((isListContainer ? 13:31)); result = prime * result + Objects.hashCode(isInherited); @@ -653,6 +654,9 @@ public class CodegenProperty implements Cloneable { if (this.isUuid != other.isUuid) { return false; } + if (this.isEmail != other.isEmail) { + return false; + } if (this.isBinary != other.isBinary) { return false; } @@ -780,6 +784,7 @@ public class CodegenProperty implements Cloneable { ", isDate=" + isDate + ", isDateTime=" + isDateTime + ", isUuid=" + isUuid + + ", isEmail=" + isEmail + ", isListContainer=" + isListContainer + ", isMapContainer=" + isMapContainer + ", isEnum=" + isEnum + diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index aebc0aa9dbc..642e44a810f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -30,7 +30,7 @@ public class CodegenResponse { public List> examples; public String dataType, baseType, containerType; public boolean hasHeaders; - public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBoolean, isDate, isDateTime, isUuid; + public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBoolean, isDate, isDateTime, isUuid, isEmail; public boolean isDefault; public boolean simpleType; public boolean primitiveType; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index b7d74c78ec4..b1adc8ffa84 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -1895,6 +1895,9 @@ public class DefaultCodegen implements CodegenConfig { // keep isString to true to make it backward compatible property.isString = true; property.isUuid = true; + } else if (ModelUtils.isEmailSchema(p)) { + property.isString = true; + property.isEmail = true; } else { property.isString = true; } @@ -2579,8 +2582,9 @@ public class DefaultCodegen implements CodegenConfig { } r.dataType = cp.dataType; - - if (Boolean.TRUE.equals(cp.isString) && Boolean.TRUE.equals(cp.isUuid)) { + if (Boolean.TRUE.equals(cp.isString) && Boolean.TRUE.equals(cp.isEmail)) { + r.isEmail = true; + } else if (Boolean.TRUE.equals(cp.isString) && Boolean.TRUE.equals(cp.isUuid)) { r.isUuid = true; } else if (Boolean.TRUE.equals(cp.isByteArray)) { r.isByteArray = true; @@ -3841,8 +3845,9 @@ public class DefaultCodegen implements CodegenConfig { LOGGER.error("Codegen Property cannot be null."); return; } - - if (Boolean.TRUE.equals(property.isUuid) && Boolean.TRUE.equals(property.isString)) { + if (Boolean.TRUE.equals(property.isEmail) && Boolean.TRUE.equals(property.isString)) { + parameter.isEmail = true; + } else if (Boolean.TRUE.equals(property.isUuid) && Boolean.TRUE.equals(property.isString)) { parameter.isUuid = true; } else if (Boolean.TRUE.equals(property.isByteArray)) { parameter.isByteArray = true; 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 d5c420154db..719c4a47042 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 @@ -34,6 +34,7 @@ import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.languages.features.BeanValidationFeatures; import org.openapitools.codegen.languages.features.OptionalFeatures; +import org.openapitools.codegen.languages.features.PerformBeanValidationFeatures; import org.openapitools.codegen.utils.URLPathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +52,8 @@ import java.util.stream.Collectors; public class SpringCodegen extends AbstractJavaCodegen - implements BeanValidationFeatures, OptionalFeatures { + implements BeanValidationFeatures, PerformBeanValidationFeatures, + OptionalFeatures { private static final Logger LOGGER = LoggerFactory.getLogger(SpringCodegen.class); public static final String TITLE = "title"; @@ -89,6 +91,7 @@ public class SpringCodegen extends AbstractJavaCodegen protected String responseWrapper = ""; protected boolean useTags = false; protected boolean useBeanValidation = true; + protected boolean performBeanValidation = false; protected boolean implicitHeaders = false; protected boolean openapiDocketConfig = false; protected boolean apiFirst = false; @@ -122,6 +125,7 @@ public class SpringCodegen extends AbstractJavaCodegen cliOptions.add(CliOption.newBoolean(VIRTUAL_SERVICE, "Generates the virtual service. For more details refer - https://github.com/elan-venture/virtualan/wiki")); cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames", useTags)); cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations", useBeanValidation)); + cliOptions.add(CliOption.newBoolean(PERFORM_BEANVALIDATION, "Use Bean Validation Impl. to perform BeanValidation", performBeanValidation)); cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers.", implicitHeaders)); cliOptions.add(CliOption.newBoolean(OPENAPI_DOCKET_CONFIG, "Generate Spring OpenAPI Docket configuration class.", openapiDocketConfig)); cliOptions.add(CliOption.newBoolean(API_FIRST, "Generate the API from the OAI spec at server compile time (API first approach)", apiFirst)); @@ -248,6 +252,11 @@ public class SpringCodegen extends AbstractJavaCodegen } writePropertyBack(USE_BEANVALIDATION, useBeanValidation); + if (additionalProperties.containsKey(PERFORM_BEANVALIDATION)) { + this.setPerformBeanValidation(convertPropertyToBoolean(PERFORM_BEANVALIDATION)); + } + writePropertyBack(PERFORM_BEANVALIDATION, performBeanValidation); + if (additionalProperties.containsKey(USE_OPTIONAL)) { this.setUseOptional(convertPropertyToBoolean(USE_OPTIONAL)); } @@ -761,6 +770,10 @@ public class SpringCodegen extends AbstractJavaCodegen this.useBeanValidation = useBeanValidation; } + public void setPerformBeanValidation(boolean performBeanValidation) { + this.performBeanValidation = performBeanValidation; + } + @Override public void setUseOptional(boolean useOptional) { this.useOptional = useOptional; diff --git a/modules/openapi-generator/src/main/resources/Java/model.mustache b/modules/openapi-generator/src/main/resources/Java/model.mustache index a42a1359e4d..2154453a885 100644 --- a/modules/openapi-generator/src/main/resources/Java/model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/model.mustache @@ -31,6 +31,9 @@ import android.os.Parcel; import javax.validation.constraints.*; import javax.validation.Valid; {{/useBeanValidation}} +{{#performBeanValidation}} +import org.hibernate.validator.constraints.*; +{{/performBeanValidation}} {{#models}} {{#model}} diff --git a/modules/openapi-generator/src/main/resources/Java/pom.mustache b/modules/openapi-generator/src/main/resources/Java/pom.mustache index a2703f141d0..ed6e39c78ea 100644 --- a/modules/openapi-generator/src/main/resources/Java/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/pom.mustache @@ -313,6 +313,14 @@ provided {{/useBeanValidation}} + {{#performBeanValidation}} + + + org.hibernate + hibernate-validator + 5.4.1.Final + + {{/performBeanValidation}} {{#parcelableModel}} diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache index 4b7b561ce70..3f98adfc6f3 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache @@ -11,6 +11,8 @@ minLength not set, maxLength set }}{{#minItems}}{{^maxItems}}@Size(min={{minItems}}) {{/maxItems}}{{/minItems}}{{! @Size: minItems not set && maxItems set }}{{^minItems}}{{#maxItems}}@Size(max={{maxItems}}) {{/maxItems}}{{/minItems}}{{! +@Email: performBeanValidation set && isEmail set +}}{{#performBeanValidation}}{{#isEmail}}@Email{{/isEmail}}{{/performBeanValidation}}{{! check for integer or long / all others=decimal type with @Decimal* isInteger set }}{{#isInteger}}{{#minimum}}@Min({{minimum}}){{/minimum}}{{#maximum}} @Max({{maximum}}) {{/maximum}}{{/isInteger}}{{! diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache index 797b2750f0e..17abea16f2e 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache @@ -10,6 +10,9 @@ import java.io.Serializable; import javax.validation.Valid; import javax.validation.constraints.*; {{/useBeanValidation}} +{{#performBeanValidation}} +import org.hibernate.validator.constraints.*; +{{/performBeanValidation}} {{#jackson}} {{#withXml}} import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;