From 8ee1841fcbf37c7d42551b2b144206c9f979a239 Mon Sep 17 00:00:00 2001 From: Jon Bayle Date: Wed, 9 Apr 2025 16:32:38 +0200 Subject: [PATCH] Add support for jakarta.validation.constraints.Email --- .../v3/core/jackson/ModelResolver.java | 25 +++++++++++++++++++ .../core/oas/models/BeanValidationsModel.java | 4 ++- .../v3/core/resolving/BeanValidatorTest.java | 8 ++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index 3235240588..12fd676a3e 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -64,6 +64,7 @@ import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.media.UUIDSchema; import io.swagger.v3.oas.models.media.XML; +import javax.validation.constraints.Email; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; @@ -1851,6 +1852,20 @@ protected boolean applyBeanValidatorAnnotations(Schema property, Annotation[] an } } } + if (annos.containsKey("javax.validation.constraints.Email")) { + Email email = (Email) annos.get("javax.validation.constraints.Email"); + boolean apply = checkGroupValidation(email.groups(), invocationGroups, acceptNoGroups); + if (apply) { + if (isStringSchema(property)) { + property.setFormat("email"); + modified = true; + } + if (property.getItems() != null && isStringSchema(property.getItems())) { + property.getItems().setFormat("email"); + modified = true; + } + } + } if (validatorProcessor != null && validatorProcessor.getMode().equals(ValidatorProcessor.MODE.AFTER)) { modified = validatorProcessor.applyBeanValidatorAnnotations(property, annotations, parent, applyNotNullAnnotations) || modified; } @@ -1961,6 +1976,16 @@ protected boolean applyBeanValidatorAnnotationsNoGroups(Schema property, Annotat modified = true; } } + if (annos.containsKey("javax.validation.constraints.Email")) { + if (isStringSchema(property)) { + property.setFormat("email"); + modified = true; + } + if (property.getItems() != null && isStringSchema(property.getItems())) { + property.getItems().setFormat("email"); + modified = true; + } + } return modified; } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/BeanValidationsModel.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/BeanValidationsModel.java index ce75707817..dc3b28fb97 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/BeanValidationsModel.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/BeanValidationsModel.java @@ -2,6 +2,7 @@ import javax.validation.constraints.DecimalMax; import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @@ -18,6 +19,7 @@ public class BeanValidationsModel { @Max(99) protected Integer age; + @Pattern(regexp = "(?![-._])[-._a-zA-Z0-9]{3,32}") protected String username; @Size(min = 6, max = 20) @@ -25,7 +27,7 @@ public class BeanValidationsModel { protected String passwordHint; - @Pattern(regexp = "(.+?)@(.+?)") + @Email protected String email; @DecimalMin(value = "0.1", inclusive = false) diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/BeanValidatorTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/BeanValidatorTest.java index 9a00b4b6ef..802e48788f 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/BeanValidatorTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/BeanValidatorTest.java @@ -3,6 +3,7 @@ import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.oas.models.BeanValidationsModel; import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.EmailSchema; import io.swagger.v3.oas.models.media.IntegerSchema; import io.swagger.v3.oas.models.media.NumberSchema; import io.swagger.v3.oas.models.media.Schema; @@ -23,6 +24,9 @@ public void readBeanValidatorTest() { Assert.assertTrue(model.getRequired().contains("id")); + final StringSchema username = (StringSchema) properties.get("username"); + Assert.assertEquals((String) username.getPattern(), "(?![-._])[-._a-zA-Z0-9]{3,32}"); + final IntegerSchema age = (IntegerSchema) properties.get("age"); Assert.assertEquals(age.getMinimum(), new BigDecimal(13.0)); Assert.assertEquals(age.getMaximum(), new BigDecimal(99.0)); @@ -31,8 +35,8 @@ public void readBeanValidatorTest() { Assert.assertEquals((int) password.getMinLength(), 6); Assert.assertEquals((int) password.getMaxLength(), 20); - final StringSchema email = (StringSchema) properties.get("email"); - Assert.assertEquals((String) email.getPattern(), "(.+?)@(.+?)"); + final EmailSchema email = (EmailSchema) properties.get("email"); + Assert.assertEquals((String) email.getFormat(), "email"); final NumberSchema minBalance = (NumberSchema) properties.get("minBalance"); Assert.assertTrue(minBalance.getExclusiveMinimum());