diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactory.java index 47037e8cac..e8544d2bb7 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactory.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.function.Predicate; +import jakarta.validation.constraints.NotNull; import org.springframework.web.server.ServerWebExchange; /** @@ -65,6 +66,7 @@ public String toString() { public static class Config { + @NotNull private ZonedDateTime datetime; public ZonedDateTime getDatetime() { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactory.java index c55bd4e801..7cf42ad604 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactory.java @@ -24,7 +24,6 @@ import jakarta.validation.constraints.NotNull; import org.springframework.util.Assert; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; /** @@ -75,7 +74,6 @@ public String toString() { }; } - @Validated public static class Config { @NotNull diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactory.java index 7b48397e31..0f017025c0 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactory.java @@ -23,7 +23,6 @@ import jakarta.validation.constraints.NotEmpty; import org.springframework.http.HttpCookie; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; /** @@ -79,7 +78,6 @@ public String toString() { }; } - @Validated public static class Config { @NotEmpty diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java index 97d8c43d10..fccadb35fc 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java @@ -24,7 +24,6 @@ import jakarta.validation.constraints.NotEmpty; import org.springframework.util.StringUtils; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; /** @@ -90,7 +89,6 @@ public String toString() { }; } - @Validated public static class Config { @NotEmpty diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java index a2a07a99a7..f9b1d4e872 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java @@ -27,7 +27,6 @@ import org.springframework.core.style.ToStringCreator; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; /** @@ -115,7 +114,6 @@ public String toString() { }; } - @Validated public static class Config { private List patterns = new ArrayList<>(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactory.java index 009b7680f9..c61e0ad1fa 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicateFactory.java @@ -21,7 +21,6 @@ import java.util.function.Predicate; import org.springframework.http.HttpMethod; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; import static java.util.Arrays.stream; @@ -67,7 +66,6 @@ public String toString() { }; } - @Validated public static class Config { private HttpMethod[] methods; diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java index 4d4ea6a1e6..509b78d70d 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java @@ -26,7 +26,6 @@ import org.springframework.core.style.ToStringCreator; import org.springframework.http.server.PathContainer; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPattern; import org.springframework.web.util.pattern.PathPattern.PathMatchInfo; @@ -134,7 +133,6 @@ public String toString() { }; } - @Validated public static class Config { private List patterns = new ArrayList<>(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactory.java index 2dd37fbd7e..1a7fd9b1ab 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactory.java @@ -23,7 +23,6 @@ import jakarta.validation.constraints.NotEmpty; import org.springframework.util.StringUtils; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; /** @@ -84,7 +83,6 @@ public String toString() { }; } - @Validated public static class Config { @NotEmpty diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactory.java index 03702cb4fd..fae598d8cb 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactory.java @@ -31,7 +31,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.gateway.support.ipresolver.RemoteAddressResolver; -import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; import static org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.GATHER_LIST; @@ -117,7 +116,6 @@ private void addSource(List sources, String source) { sources.add(new IpSubnetFilterRule(ipAddress, cidrPrefix, IpFilterRuleType.ACCEPT)); } - @Validated public static class Config { @NotEmpty diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java index eb64a4f649..1344c9eb59 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateFactoryTests.java @@ -18,8 +18,13 @@ import java.time.ZonedDateTime; import java.util.HashMap; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import org.springframework.cloud.gateway.handler.predicate.AfterRoutePredicateFactory.Config; @@ -99,4 +104,29 @@ public void toStringFormat() { assertThat(predicate.toString()).contains("After: " + config.getDatetime()); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setDatetime(ZonedDateTime.now()); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(1); + } + } + } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java index 585ef49df1..9ffb5b3db4 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateFactoryTests.java @@ -18,10 +18,17 @@ import java.time.ZonedDateTime; import java.util.HashMap; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; +import org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory.Config; + import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory.DATETIME_KEY; import static org.springframework.cloud.gateway.handler.predicate.BetweenRoutePredicateFactoryTests.bindConfig; @@ -85,17 +92,42 @@ private boolean runPredicate(String dateString) { BeforeRoutePredicateFactory factory = new BeforeRoutePredicateFactory(); - BeforeRoutePredicateFactory.Config config = bindConfig(map, factory); + Config config = bindConfig(map, factory); return factory.apply(config).test(getExchange()); } @Test public void toStringFormat() { - BeforeRoutePredicateFactory.Config config = new BeforeRoutePredicateFactory.Config(); + Config config = new Config(); config.setDatetime(ZonedDateTime.now()); Predicate predicate = new BeforeRoutePredicateFactory().apply(config); assertThat(predicate.toString()).contains("Before: " + config.getDatetime()); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setDatetime(ZonedDateTime.now()); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(1); + } + } + } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java index 18913c1309..c6cbbd1dad 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateFactoryTests.java @@ -19,11 +19,17 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import org.springframework.boot.convert.ApplicationConversionService; +import org.springframework.cloud.gateway.handler.predicate.BetweenRoutePredicateFactory.Config; import org.springframework.cloud.gateway.support.ConfigurationService; import org.springframework.cloud.gateway.support.StringToZonedDateTimeConverter; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; @@ -152,14 +158,14 @@ boolean runPredicate(String dateString1, String dateString2) { BetweenRoutePredicateFactory factory = new BetweenRoutePredicateFactory(); - BetweenRoutePredicateFactory.Config config = bindConfig(map, factory); + Config config = bindConfig(map, factory); return factory.apply(config).test(getExchange()); } @Test public void toStringFormat() { - BetweenRoutePredicateFactory.Config config = new BetweenRoutePredicateFactory.Config(); + Config config = new Config(); config.setDatetime1(ZonedDateTime.now()); config.setDatetime2(ZonedDateTime.now().plusHours(1)); Predicate predicate = new BetweenRoutePredicateFactory().apply(config); @@ -167,4 +173,30 @@ public void toStringFormat() { .contains("Between: " + config.getDatetime1() + " and " + config.getDatetime2()); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setDatetime1(ZonedDateTime.now()); + config.setDatetime2(ZonedDateTime.now()); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(2); + } + } + } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java index 07d79a5e52..92f70bcd84 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicateFactoryTests.java @@ -16,8 +16,13 @@ package org.springframework.cloud.gateway.handler.predicate; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import org.springframework.cloud.gateway.handler.predicate.CookieRoutePredicateFactory.Config; @@ -64,4 +69,30 @@ public void toStringFormat() { assertThat(predicate.toString()).contains("Cookie: name=mycookie regexp=myregexp"); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setName("mycookie"); + config.setRegexp("myregexp"); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(2); + } + } + } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java index 6792ed9792..1a8f5a88d0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java @@ -16,8 +16,13 @@ package org.springframework.cloud.gateway.handler.predicate; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; @@ -106,6 +111,31 @@ public void headerRouteHandlesCommaSeparatedValues() { .valueEquals(ROUTE_ID_HEADER, "header_test_comma_separated"); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setHeader("myheader"); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(1); + } + } + @EnableAutoConfiguration @SpringBootConfiguration @Import(DefaultTestConfig.class) diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java index 270a1a5051..e3abf08fd0 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicateFactoryTests.java @@ -16,8 +16,13 @@ package org.springframework.cloud.gateway.handler.predicate; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -87,6 +92,31 @@ public void toStringFormat() { assertThat(predicate.toString()).contains("Query: param=myparam regexp=myregexp"); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setParam("myparam"); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(1); + } + } + @EnableAutoConfiguration @SpringBootConfiguration @Import(DefaultTestConfig.class) diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java index 2599d34c8e..e1e0a255f3 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicateFactoryTests.java @@ -17,8 +17,13 @@ package org.springframework.cloud.gateway.handler.predicate; import java.time.Duration; +import java.util.Set; import java.util.function.Predicate; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -89,6 +94,31 @@ public void toStringFormat() { assertThat(predicate.toString()).contains("RemoteAddrs: [1.2.3.4, 5.6.7.8]"); } + @Test + public void testConfig() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + config.setSources("1.2.3.4", "5.6.7.8"); + + assertThat(validator.validate(config).isEmpty()).isTrue(); + } + } + + @Test + public void testConfigNullField() { + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + Validator validator = factory.getValidator(); + + Config config = new Config(); + Set> validate = validator.validate(config); + + assertThat(validate.isEmpty()).isFalse(); + assertThat(validate.size()).isEqualTo(1); + } + } + @EnableAutoConfiguration @SpringBootConfiguration @Import(DefaultTestConfig.class)