diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolverBuilder.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolverBuilder.java index d136e323cc..f545c08911 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolverBuilder.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolverBuilder.java @@ -27,7 +27,55 @@ import org.springframework.util.CollectionUtils; /** - * Builder for {@link CompositeContentTypeResolver}. + * Factory to create a {@link CompositeContentTypeResolver} and configure it with + * one or more {@link ContentTypeResolver} instances with build style methods. + * The following table shows methods, resulting strategy instances, and if in + * use by default: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Property SetterUnderlying StrategyDefault Setting
{@link #favorPathExtension}{@link PathExtensionContentTypeResolver Path Extension resolver}On
{@link #favorParameter}{@link ParameterContentTypeResolver Parameter resolver}Off
{@link #ignoreAcceptHeader}{@link HeaderContentTypeResolver Header resolver}On
{@link #defaultContentType}{@link FixedContentTypeResolver Fixed content resolver}Not set
{@link #defaultContentTypeResolver}{@link ContentTypeResolver}Not set
+ * + *

The order in which resolvers are configured is fixed. Config methods may only + * turn individual resolvers on or off. If you need a custom order for any + * reason simply instantiate {@code {@link CompositeContentTypeResolver}} directly. + * + *

For the path extension and parameter resolvers you may explicitly add + * {@link #mediaTypes(Map)}. This will be used to resolve path extensions or a + * parameter value such as "json" to a media type such as "application/json". + * + *

The path extension strategy will also use the Java Activation framework + * (JAF), if available, to resolve a path extension to a MediaType. You may + * {@link #useJaf suppress} the use of JAF. * * @author Rossen Stoyanchev */ diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java index d9943b009a..156d420440 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java @@ -28,6 +28,7 @@ import org.springframework.http.MediaType; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.reactive.accept.CompositeContentTypeResolverBuilder; import org.springframework.web.reactive.accept.ContentTypeResolver; import org.springframework.web.reactive.accept.HeaderContentTypeResolver; import org.springframework.web.server.ServerWebExchange; @@ -96,7 +97,8 @@ public final class ProducesRequestCondition extends AbstractRequestCondition(expressions); Collections.sort(this.expressions); - this.contentTypeResolver = (resolver != null ? resolver : new HeaderContentTypeResolver()); + this.contentTypeResolver = (resolver != null ? + resolver : new CompositeContentTypeResolverBuilder().build()); } 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 26ae11b43a..a5f23e986b 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 @@ -27,6 +27,8 @@ import org.springframework.util.Assert; import org.springframework.util.StringValueResolver; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.reactive.accept.CompositeContentTypeResolver; +import org.springframework.web.reactive.accept.CompositeContentTypeResolverBuilder; import org.springframework.web.reactive.accept.ContentTypeResolver; import org.springframework.web.reactive.accept.HeaderContentTypeResolver; import org.springframework.web.reactive.result.condition.RequestCondition; @@ -49,7 +51,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi private boolean useTrailingSlashMatch = true; - private ContentTypeResolver contentTypeResolver = new HeaderContentTypeResolver(); + private ContentTypeResolver contentTypeResolver = new CompositeContentTypeResolverBuilder().build(); private StringValueResolver embeddedValueResolver; 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 3afe014a61..8635b6f9eb 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 @@ -81,7 +81,7 @@ public class RequestMappingHandlerMappingTests { assertTrue(this.handlerMapping.useSuffixPatternMatch()); assertTrue(this.handlerMapping.useRegisteredSuffixPatternMatch()); - assertEquals(Collections.singletonList("json"), this.handlerMapping.getFileExtensions()); + assertEquals(Collections.singleton("json"), this.handlerMapping.getFileExtensions()); } @Test