Add supportedVersionPredicate to ApiVersionConfigurer

Closes gh-35267
This commit is contained in:
rstoyanchev
2025-08-01 12:35:18 +01:00
parent 87838aa4c5
commit 2b1a815167
12 changed files with 117 additions and 48 deletions
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -50,6 +51,8 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
private final Set<Comparable<?>> detectedVersions = new TreeSet<>();
private final Predicate<Comparable<?>> supportedVersionPredicate;
private final @Nullable ApiVersionDeprecationHandler deprecationHandler;
@@ -71,7 +74,8 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
*/
public DefaultApiVersionStrategy(
List<ApiVersionResolver> versionResolvers, ApiVersionParser<?> versionParser,
boolean versionRequired, @Nullable String defaultVersion, boolean detectSupportedVersions,
boolean versionRequired, @Nullable String defaultVersion,
boolean detectSupportedVersions, @Nullable Predicate<Comparable<?>> supportedVersionPredicate,
@Nullable ApiVersionDeprecationHandler deprecationHandler) {
Assert.notEmpty(versionResolvers, "At least one ApiVersionResolver is required");
@@ -82,9 +86,16 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
this.versionRequired = (versionRequired && defaultVersion == null);
this.defaultVersion = (defaultVersion != null ? versionParser.parseVersion(defaultVersion) : null);
this.detectSupportedVersions = detectSupportedVersions;
this.supportedVersionPredicate = initSupportedVersionPredicate(supportedVersionPredicate);
this.deprecationHandler = deprecationHandler;
}
private Predicate<Comparable<?>> initSupportedVersionPredicate(@Nullable Predicate<Comparable<?>> predicate) {
return (predicate != null ? predicate :
(version -> (this.supportedVersions.contains(version) ||
this.detectSupportedVersions && this.detectedVersions.contains(version))));
}
@Override
public @Nullable Comparable<?> getDefaultVersion() {
@@ -160,16 +171,11 @@ public class DefaultApiVersionStrategy implements ApiVersionStrategy {
return;
}
if (!isSupportedVersion(requestVersion)) {
if (!this.supportedVersionPredicate.test(requestVersion)) {
throw new InvalidApiVersionException(requestVersion.toString());
}
}
private boolean isSupportedVersion(Comparable<?> requestVersion) {
return (this.supportedVersions.contains(requestVersion) ||
this.detectSupportedVersions && this.detectedVersions.contains(requestVersion));
}
@Override
public void handleDeprecations(Comparable<?> version, HttpServletRequest request, HttpServletResponse response) {
if (this.deprecationHandler != null) {