diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/FileExtensionContentTypeResolver.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/MappingContentTypeResolver.java similarity index 69% rename from spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/FileExtensionContentTypeResolver.java rename to spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/MappingContentTypeResolver.java index 8343c8da7cc..645beed0776 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/FileExtensionContentTypeResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/MappingContentTypeResolver.java @@ -17,16 +17,17 @@ package org.springframework.web.reactive.accept; import java.util.List; +import java.util.Set; import org.springframework.http.MediaType; /** - * An extension of {@link ContentTypeResolver} for a resolver that uses file - * extensions and can expose file extension mappings. + * An extension of {@link ContentTypeResolver} that maintains a mapping between + * keys (e.g. file extension, query parameter) and media types. * * @author Rossen Stoyanchev */ -public interface FileExtensionContentTypeResolver extends ContentTypeResolver { +public interface MappingContentTypeResolver extends ContentTypeResolver { /** * Resolve the given media type to a list of path extensions. @@ -34,12 +35,12 @@ public interface FileExtensionContentTypeResolver extends ContentTypeResolver { * @param mediaType the media type to resolve * @return a list of extensions or an empty list, never {@code null} */ - List getFileExtensions(MediaType mediaType); + Set getKeysFor(MediaType mediaType); /** - * Return all registered file extensions. - * @return a list of extensions or an empty list, never {@code null} + * Return all registered keys (e.g. "json", "xml"). + * @return a list of keys or an empty list, never {@code null} */ - List getAllFileExtensions(); + Set getKeys(); } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java index cba2fe75ef0..5c30eafe7c0 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -50,7 +51,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition fileExtensions = new ArrayList(); + private final Set fileExtensions = new HashSet<>(); /** @@ -74,7 +75,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition extensions) { + Set extensions) { this(asList(patterns), pathHelper, pathMatcher, useSuffixPatternMatch, useTrailingSlashMatch, extensions); } @@ -84,7 +85,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition patterns, HttpRequestPathHelper pathHelper, PathMatcher pathMatcher, boolean useSuffixPatternMatch, boolean useTrailingSlashMatch, - List fileExtensions) { + Set fileExtensions) { this.patterns = Collections.unmodifiableSet(prependLeadingSlash(patterns)); this.pathHelper = (pathHelper != null ? pathHelper : new HttpRequestPathHelper()); diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java index 15f91ea04d6..bebceeb3e2e 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java @@ -16,13 +16,13 @@ package org.springframework.web.reactive.result.method; -import java.util.List; +import java.util.Set; import org.springframework.util.PathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.reactive.accept.ContentTypeResolver; -import org.springframework.web.reactive.accept.FileExtensionContentTypeResolver; +import org.springframework.web.reactive.accept.MappingContentTypeResolver; import org.springframework.web.reactive.result.condition.ConsumesRequestCondition; import org.springframework.web.reactive.result.condition.HeadersRequestCondition; import org.springframework.web.reactive.result.condition.ParamsRequestCondition; @@ -576,11 +576,11 @@ public final class RequestMappingInfo implements RequestCondition getFileExtensions() { + public Set getFileExtensions() { ContentTypeResolver resolver = getContentTypeResolver(); if (useRegisteredSuffixPatternMatch() && resolver != null) { - if (resolver instanceof FileExtensionContentTypeResolver) { - return ((FileExtensionContentTypeResolver) resolver).getAllFileExtensions(); + if (resolver instanceof MappingContentTypeResolver) { + return ((MappingContentTypeResolver) resolver).getKeys(); } } return null; diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java index 96ec3b6c6e5..26ae11b43aa 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java @@ -18,7 +18,7 @@ package org.springframework.web.reactive.result.method.annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; -import java.util.List; +import java.util.Set; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.core.annotation.AnnotatedElementUtils; @@ -149,7 +149,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi /** * Return the file extensions to use for suffix pattern matching. */ - public List getFileExtensions() { + public Set getFileExtensions() { return this.config.getFileExtensions(); } diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java index 715b247425c..4720f94b6ad 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java @@ -19,7 +19,7 @@ package org.springframework.web.reactive.result.condition; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; -import java.util.List; +import java.util.Set; import org.junit.Test; @@ -131,7 +131,7 @@ public class PatternsRequestConditionTests { @Test public void matchSuffixPatternUsingFileExtensions() throws Exception { String[] patterns = new String[] {"/jobs/{jobName}"}; - List extensions = Collections.singletonList("json"); + Set extensions = Collections.singleton("json"); PatternsRequestCondition condition = new PatternsRequestCondition(patterns, null, null, true, false, extensions); ServerWebExchange exchange = createExchange("/jobs/my.job"); @@ -150,7 +150,7 @@ public class PatternsRequestConditionTests { @Test public void matchSuffixPatternUsingFileExtensions2() throws Exception { PatternsRequestCondition condition1 = new PatternsRequestCondition( - new String[] {"/prefix"}, null, null, true, false, Collections.singletonList("json")); + new String[] {"/prefix"}, null, null, true, false, Collections.singleton("json")); PatternsRequestCondition condition2 = new PatternsRequestCondition( new String[] {"/suffix"}, null, null, true, false, null); diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java index f8feef526d1..3afe014a614 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMappingTests.java @@ -39,7 +39,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.support.StaticWebApplicationContext; -import org.springframework.web.reactive.accept.FileExtensionContentTypeResolver; +import org.springframework.web.reactive.accept.MappingContentTypeResolver; import org.springframework.web.reactive.result.method.RequestMappingInfo; import static org.junit.Assert.assertArrayEquals; @@ -73,8 +73,8 @@ public class RequestMappingHandlerMappingTests { assertTrue(this.handlerMapping.useSuffixPatternMatch()); assertTrue(this.handlerMapping.useRegisteredSuffixPatternMatch()); - FileExtensionContentTypeResolver contentTypeResolver = mock(FileExtensionContentTypeResolver.class); - when(contentTypeResolver.getAllFileExtensions()).thenReturn(Collections.singletonList("json")); + MappingContentTypeResolver contentTypeResolver = mock(MappingContentTypeResolver.class); + when(contentTypeResolver.getKeys()).thenReturn(Collections.singleton("json")); this.handlerMapping.setContentTypeResolver(contentTypeResolver); this.handlerMapping.afterPropertiesSet(); @@ -86,8 +86,8 @@ public class RequestMappingHandlerMappingTests { @Test public void useRegisteredSuffixPatternMatchInitialization() { - FileExtensionContentTypeResolver contentTypeResolver = mock(FileExtensionContentTypeResolver.class); - when(contentTypeResolver.getAllFileExtensions()).thenReturn(Collections.singletonList("json")); + MappingContentTypeResolver contentTypeResolver = mock(MappingContentTypeResolver.class); + when(contentTypeResolver.getKeys()).thenReturn(Collections.singleton("json")); final Set actualExtensions = new HashSet<>(); RequestMappingHandlerMapping localHandlerMapping = new RequestMappingHandlerMapping() {