diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/VersionRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/VersionRequestCondition.java index 45302f7af2b..b762aec91d2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/VersionRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/VersionRequestCondition.java @@ -128,7 +128,9 @@ public final class VersionRequestCondition extends AbstractRequestCondition version = exchange.getAttribute(HandlerMapping.API_VERSION_ATTRIBUTE); + return (version != null ? (this.version != null ? -1 : 1) : (this.version != null ? 1 : -1)); } } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/VersionRequestConditionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/VersionRequestConditionTests.java index 0f57ce25d26..06940692aa1 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/VersionRequestConditionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/VersionRequestConditionTests.java @@ -18,6 +18,7 @@ package org.springframework.web.reactive.result.condition; import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; @@ -159,6 +160,15 @@ public class VersionRequestConditionTests { condition.handleMatch(exchange); } + @Test + void compareWithoutRequestVersion() { + VersionRequestCondition condition = Stream.of(condition("1.1"), condition("1.2"), emptyCondition()) + .min((c1, c2) -> c1.compareTo(c2, exchange())) + .get(); + + assertThat(condition).isEqualTo(emptyCondition()); + } + private VersionRequestCondition condition(String v) { this.strategy.addSupportedVersion(v.endsWith("+") ? v.substring(0, v.length() - 1) : v); return new VersionRequestCondition(v, this.strategy); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/VersionRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/VersionRequestCondition.java index dce48a3b651..2bc8f0a33e8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/VersionRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/VersionRequestCondition.java @@ -127,7 +127,9 @@ public final class VersionRequestCondition extends AbstractRequestCondition version = (Comparable) request.getAttribute(HandlerMapping.API_VERSION_ATTRIBUTE); + return (version != null ? (this.version != null ? -1 : 1) : (this.version != null ? 1 : -1)); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/VersionRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/VersionRequestConditionTests.java index 543de9e18f7..5ee4ddff5c3 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/VersionRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/VersionRequestConditionTests.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.mvc.condition; import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; @@ -146,6 +147,15 @@ public class VersionRequestConditionTests { assertThat(list.get(0)).isEqualTo(condition(expected)); } + @Test + void compareWithoutRequestVersion() { + VersionRequestCondition condition = Stream.of(condition("1.1"), condition("1.2"), emptyCondition()) + .min((c1, c2) -> c1.compareTo(c2, new MockHttpServletRequest())) + .get(); + + assertThat(condition).isEqualTo(emptyCondition()); + } + @Test // gh-35236 void noRequestVersion() { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/path");