From a7e3a438c9d7d6dd5820fd7439f4fbade32f39c5 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 28 Aug 2025 15:14:29 +0300 Subject: [PATCH] Correctly apply required API version validation Closes gh-35386 --- .../web/accept/ApiVersionStrategy.java | 19 +++++++++++-------- .../DefaultApiVersionStrategiesTests.java | 9 +++++---- .../reactive/accept/ApiVersionStrategy.java | 19 +++++++++++-------- .../DefaultApiVersionStrategiesTests.java | 9 +++++---- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java index 9418ab7be05..8b4d700f0f2 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/ApiVersionStrategy.java @@ -70,17 +70,20 @@ public interface ApiVersionStrategy { */ default @Nullable Comparable resolveParseAndValidateVersion(HttpServletRequest request) { String value = resolveVersion(request); + Comparable version; if (value == null) { - return getDefaultVersion(); + version = getDefaultVersion(); } - try { - Comparable version = parseVersion(value); - validateVersion(version, request); - return version; - } - catch (Exception ex) { - throw new InvalidApiVersionException(value, null, ex); + else { + try { + version = parseVersion(value); + } + catch (Exception ex) { + throw new InvalidApiVersionException(value, null, ex); + } } + validateVersion(version, request); + return version; } /** diff --git a/spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java b/spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java index 222798a3bc8..5edea422003 100644 --- a/spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java +++ b/spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java @@ -35,8 +35,6 @@ public class DefaultApiVersionStrategiesTests { private static final SemanticApiVersionParser parser = new SemanticApiVersionParser(); - private final MockHttpServletRequest request = new MockHttpServletRequest(); - @Test void defaultVersionIsParsed() { @@ -113,8 +111,11 @@ public class DefaultApiVersionStrategiesTests { } private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) { - Comparable parsedVersion = (version != null ? parser.parseVersion(version) : null); - strategy.validateVersion(parsedVersion, request); + MockHttpServletRequest request = new MockHttpServletRequest(); + if (version != null) { + request.setParameter("api-version", version); + } + strategy.resolveParseAndValidateVersion(request); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java index fc7cca7af51..762c7cc623d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/ApiVersionStrategy.java @@ -72,17 +72,20 @@ public interface ApiVersionStrategy { */ default @Nullable Comparable resolveParseAndValidateVersion(ServerWebExchange exchange) { String value = resolveVersion(exchange); + Comparable version; if (value == null) { - return getDefaultVersion(); + version = getDefaultVersion(); } - try { - Comparable version = parseVersion(value); - validateVersion(version, exchange); - return version; - } - catch (Exception ex) { - throw new InvalidApiVersionException(value, null, ex); + else { + try { + version = parseVersion(value); + } + catch (Exception ex) { + throw new InvalidApiVersionException(value, null, ex); + } } + validateVersion(version, exchange); + return version; } /** diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java index 367587dd50c..f826dccf311 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java @@ -25,7 +25,6 @@ import org.junit.jupiter.api.Test; import org.springframework.web.accept.InvalidApiVersionException; import org.springframework.web.accept.MissingApiVersionException; import org.springframework.web.accept.SemanticApiVersionParser; -import org.springframework.web.server.ServerWebExchange; import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; import org.springframework.web.testfixture.server.MockServerWebExchange; @@ -40,8 +39,6 @@ public class DefaultApiVersionStrategiesTests { private static final SemanticApiVersionParser parser = new SemanticApiVersionParser(); - private final ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")); - @Test void defaultVersionIsParsed() { @@ -114,8 +111,12 @@ public class DefaultApiVersionStrategiesTests { } private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) { + MockServerHttpRequest.BaseBuilder requestBuilder = MockServerHttpRequest.get("/"); + if (version != null) { + requestBuilder.queryParam("api-version", version); + } Comparable parsedVersion = (version != null ? parser.parseVersion(version) : null); - strategy.validateVersion(parsedVersion, exchange); + strategy.resolveParseAndValidateVersion(MockServerWebExchange.builder(requestBuilder).build()); } }