提交 9ffc0b5e 编写于 作者: R Rossen Stoyanchev

Update FileExtensionContentTypeResolver

Rename to MappingContentTypeResolver and replace "fileExtension" with
"key" in methods to be more general (e.g. file extension or query
param). Also switch from List to Set for the return values.
上级 7d60c276
......@@ -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<String> getFileExtensions(MediaType mediaType);
Set<String> 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<String> getAllFileExtensions();
Set<String> getKeys();
}
......@@ -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<Pat
private final boolean useTrailingSlashMatch;
private final List<String> fileExtensions = new ArrayList<String>();
private final Set<String> fileExtensions = new HashSet<>();
/**
......@@ -74,7 +75,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
*/
public PatternsRequestCondition(String[] patterns, HttpRequestPathHelper pathHelper,
PathMatcher pathMatcher, boolean useSuffixPatternMatch, boolean useTrailingSlashMatch,
List<String> extensions) {
Set<String> extensions) {
this(asList(patterns), pathHelper, pathMatcher, useSuffixPatternMatch, useTrailingSlashMatch, extensions);
}
......@@ -84,7 +85,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
*/
private PatternsRequestCondition(Collection<String> patterns, HttpRequestPathHelper pathHelper,
PathMatcher pathMatcher, boolean useSuffixPatternMatch, boolean useTrailingSlashMatch,
List<String> fileExtensions) {
Set<String> fileExtensions) {
this.patterns = Collections.unmodifiableSet(prependLeadingSlash(patterns));
this.pathHelper = (pathHelper != null ? pathHelper : new HttpRequestPathHelper());
......
......@@ -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<RequestMapping
* {@code registeredSuffixPatternMatch=true}, the extensions are obtained
* from the configured {@code contentTypeResolver}.
*/
public List<String> getFileExtensions() {
public Set<String> 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;
......
......@@ -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<String> getFileExtensions() {
public Set<String> getFileExtensions() {
return this.config.getFileExtensions();
}
......
......@@ -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<String> extensions = Collections.singletonList("json");
Set<String> 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);
......
......@@ -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<String> actualExtensions = new HashSet<>();
RequestMappingHandlerMapping localHandlerMapping = new RequestMappingHandlerMapping() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册