Skip to content

Commit 11cb062

Browse files
committed
Assert versionRequired and defaultVersion
Closes gh-35387
1 parent a7e3a43 commit 11cb062

File tree

8 files changed

+42
-17
lines changed

8 files changed

+42
-17
lines changed

spring-web/src/main/java/org/springframework/web/accept/DefaultApiVersionStrategy.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
6161
* @param versionResolvers one or more resolvers to try; the first non-null
6262
* value returned by any resolver becomes the value used
6363
* @param versionParser parser for raw version values
64-
* @param versionRequired whether a version is required; if a request
65-
* does not have a version, and a {@code defaultVersion} is not specified,
66-
* validation fails with {@link MissingApiVersionException}
64+
* @param versionRequired whether a version is required leading to
65+
* {@link MissingApiVersionException} for requests that don't have one;
66+
* by default set to true unless there is a defaultVersion
6767
* @param defaultVersion a default version to assign to requests that
6868
* don't specify one
6969
* @param detectSupportedVersions whether to use API versions that appear in
@@ -74,16 +74,18 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
7474
*/
7575
public DefaultApiVersionStrategy(
7676
List<ApiVersionResolver> versionResolvers, ApiVersionParser<?> versionParser,
77-
boolean versionRequired, @Nullable String defaultVersion,
77+
@Nullable Boolean versionRequired, @Nullable String defaultVersion,
7878
boolean detectSupportedVersions, @Nullable Predicate<Comparable<?>> supportedVersionPredicate,
7979
@Nullable ApiVersionDeprecationHandler deprecationHandler) {
8080

8181
Assert.notEmpty(versionResolvers, "At least one ApiVersionResolver is required");
8282
Assert.notNull(versionParser, "ApiVersionParser is required");
83+
Assert.isTrue(defaultVersion == null || versionRequired == null || !versionRequired,
84+
"versionRequired cannot be set to true if a defaultVersion is also configured");
8385

8486
this.versionResolvers = new ArrayList<>(versionResolvers);
8587
this.versionParser = versionParser;
86-
this.versionRequired = (versionRequired && defaultVersion == null);
88+
this.versionRequired = (versionRequired != null ? versionRequired : defaultVersion == null);
8789
this.defaultVersion = (defaultVersion != null ? versionParser.parseVersion(defaultVersion) : null);
8890
this.detectSupportedVersions = detectSupportedVersions;
8991
this.supportedVersionPredicate = initSupportedVersionPredicate(supportedVersionPredicate);

spring-web/src/test/java/org/springframework/web/accept/DefaultApiVersionStrategiesTests.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
2626

2727
import static org.assertj.core.api.Assertions.assertThat;
28+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
2829
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2930

3031
/**
@@ -93,6 +94,16 @@ void validateUnsupportedWithPredicate() {
9394
assertThatThrownBy(() -> validateVersion("1.2", strategy)).isInstanceOf(InvalidApiVersionException.class);
9495
}
9596

97+
@Test
98+
void versionRequiredAndDefaultVersionSet() {
99+
assertThatIllegalArgumentException()
100+
.isThrownBy(() ->
101+
new DefaultApiVersionStrategy(
102+
List.of(request -> request.getParameter("api-version")), new SemanticApiVersionParser(),
103+
true, "1.2", true, version -> true, null))
104+
.withMessage("versionRequired cannot be set to true if a defaultVersion is also configured");
105+
}
106+
96107
private static DefaultApiVersionStrategy apiVersionStrategy() {
97108
return apiVersionStrategy(null, false, null);
98109
}
@@ -107,7 +118,7 @@ private static DefaultApiVersionStrategy apiVersionStrategy(
107118

108119
return new DefaultApiVersionStrategy(
109120
List.of(request -> request.getParameter("api-version")), new SemanticApiVersionParser(),
110-
true, defaultVersion, detectSupportedVersions, supportedVersionPredicate, null);
121+
null, defaultVersion, detectSupportedVersions, supportedVersionPredicate, null);
111122
}
112123

113124
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {

spring-webflux/src/main/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategy.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
6363
* @param versionResolvers one or more resolvers to try; the first non-null
6464
* value returned by any resolver becomes the resolved used
6565
* @param versionParser parser for to raw version values
66-
* @param versionRequired whether a version is required; if a request
67-
* does not have a version, and a {@code defaultVersion} is not specified,
68-
* validation fails with {@link MissingApiVersionException}
66+
* @param versionRequired whether a version is required leading to
67+
* {@link MissingApiVersionException} for requests that don't have one;
68+
* by default set to true unless there is a defaultVersion
6969
* @param defaultVersion a default version to assign to requests that
7070
* don't specify one
7171
* @param detectSupportedVersions whether to use API versions that appear in
@@ -76,16 +76,18 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
7676
*/
7777
public DefaultApiVersionStrategy(
7878
List<ApiVersionResolver> versionResolvers, ApiVersionParser<?> versionParser,
79-
boolean versionRequired, @Nullable String defaultVersion,
79+
@Nullable Boolean versionRequired, @Nullable String defaultVersion,
8080
boolean detectSupportedVersions, @Nullable Predicate<Comparable<?>> supportedVersionPredicate,
8181
@Nullable ApiVersionDeprecationHandler deprecationHandler) {
8282

8383
Assert.notEmpty(versionResolvers, "At least one ApiVersionResolver is required");
8484
Assert.notNull(versionParser, "ApiVersionParser is required");
85+
Assert.isTrue(defaultVersion == null || versionRequired == null || !versionRequired,
86+
"versionRequired cannot be set to true if a defaultVersion is also configured");
8587

8688
this.versionResolvers = new ArrayList<>(versionResolvers);
8789
this.versionParser = versionParser;
88-
this.versionRequired = (versionRequired && defaultVersion == null);
90+
this.versionRequired = (versionRequired != null ? versionRequired : defaultVersion == null);
8991
this.defaultVersion = (defaultVersion != null ? versionParser.parseVersion(defaultVersion) : null);
9092
this.detectSupportedVersions = detectSupportedVersions;
9193
this.supportedVersionPredicate = initSupportedVersionPredicate(supportedVersionPredicate);

spring-webflux/src/main/java/org/springframework/web/reactive/config/ApiVersionConfigurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ public ApiVersionConfigurer setDeprecationHandler(ApiVersionDeprecationHandler h
212212

213213
DefaultApiVersionStrategy strategy = new DefaultApiVersionStrategy(this.versionResolvers,
214214
(this.versionParser != null ? this.versionParser : new SemanticApiVersionParser()),
215-
(this.versionRequired != null ? this.versionRequired : true), this.defaultVersion,
215+
this.versionRequired, this.defaultVersion,
216216
this.detectSupportedVersions, this.supportedVersionPredicate,
217217
this.deprecationHandler);
218218

spring-webflux/src/test/java/org/springframework/web/reactive/accept/DefaultApiVersionStrategiesTests.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.web.testfixture.server.MockServerWebExchange;
3030

3131
import static org.assertj.core.api.Assertions.assertThat;
32+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3233
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3334

3435
/**
@@ -97,6 +98,16 @@ void validateUnsupportedWithPredicate() {
9798
assertThatThrownBy(() -> validateVersion("1.2", strategy)).isInstanceOf(InvalidApiVersionException.class);
9899
}
99100

101+
@Test
102+
void versionRequiredAndDefaultVersionSet() {
103+
assertThatIllegalArgumentException()
104+
.isThrownBy(() ->
105+
new org.springframework.web.accept.DefaultApiVersionStrategy(
106+
List.of(request -> request.getParameter("api-version")), new SemanticApiVersionParser(),
107+
true, "1.2", true, version -> true, null))
108+
.withMessage("versionRequired cannot be set to true if a defaultVersion is also configured");
109+
}
110+
100111
private static DefaultApiVersionStrategy apiVersionStrategy() {
101112
return apiVersionStrategy(null, false, null);
102113
}
@@ -107,15 +118,14 @@ private static DefaultApiVersionStrategy apiVersionStrategy(
107118

108119
return new DefaultApiVersionStrategy(
109120
List.of(exchange -> exchange.getRequest().getQueryParams().getFirst("api-version")),
110-
parser, true, defaultVersion, detectSupportedVersions, supportedVersionPredicate, null);
121+
parser, null, defaultVersion, detectSupportedVersions, supportedVersionPredicate, null);
111122
}
112123

113124
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
114125
MockServerHttpRequest.BaseBuilder<?> requestBuilder = MockServerHttpRequest.get("/");
115126
if (version != null) {
116127
requestBuilder.queryParam("api-version", version);
117128
}
118-
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
119129
strategy.resolveParseAndValidateVersion(MockServerWebExchange.builder(requestBuilder).build());
120130
}
121131

spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/VersionRequestConditionTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void setUp() {
5252
private static DefaultApiVersionStrategy initVersionStrategy(@Nullable String defaultVersion) {
5353
return new DefaultApiVersionStrategy(
5454
List.of(exchange -> exchange.getRequest().getQueryParams().getFirst("api-version")),
55-
new SemanticApiVersionParser(), true, defaultVersion, false, null, null);
55+
new SemanticApiVersionParser(), null, defaultVersion, false, null, null);
5656
}
5757

5858
@Test

spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ApiVersionConfigurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public ApiVersionConfigurer setDeprecationHandler(ApiVersionDeprecationHandler h
213213

214214
DefaultApiVersionStrategy strategy = new DefaultApiVersionStrategy(this.versionResolvers,
215215
(this.versionParser != null ? this.versionParser : new SemanticApiVersionParser()),
216-
(this.versionRequired != null ? this.versionRequired : true), this.defaultVersion,
216+
this.versionRequired, this.defaultVersion,
217217
this.detectSupportedVersions, this.supportedVersionPredicate,
218218
this.deprecationHandler);
219219

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/VersionRequestConditionTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void setUp() {
5050
private static DefaultApiVersionStrategy initVersionStrategy(@Nullable String defaultVersion) {
5151
return new DefaultApiVersionStrategy(
5252
List.of(request -> request.getParameter("api-version")),
53-
new SemanticApiVersionParser(), true, defaultVersion, false, null, null);
53+
new SemanticApiVersionParser(), null, defaultVersion, false, null, null);
5454
}
5555

5656
@Test

0 commit comments

Comments
 (0)