From 0662dbf0447d8e788575fcf73fafe248b74cbe8d Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 23 Mar 2017 16:23:34 -0400 Subject: [PATCH] String decoding for text only vs any MIME type Follow-up to: https://github.com/spring-projects/spring-framework/commit/3d68c496f15c80a75711480a569cda1f7c64dc91 StringDecoder can be created in text-only vs "*/*" mode which in turn allows a more intuitive order of client side decoders, e.g. SSE does not have to be ahead of StringDecoder. The commit also explicitly disables String from the supported types in Jackson2Decoder leaving it to the StringDecoder in "*/*" mode which comes after. This does not change the current arrangement since the the StringDecoder ahead having "*/*" picks up JSON content just the same. From a broader perspective this change allows any decoder to deal with String if it wants to after examining the content type be it the SSE or another, custom decoder. For Jackson there is very little value in decoding to String which works only if the output contains a single JSON string but will fail to parse anything else (JSON object/array) while StringDecoder in "*/*" mode will not fail. Issue: SPR-15374 --- .../core/codec/StringDecoder.java | 30 ++++++++++++------- .../core/codec/StringDecoderTests.java | 6 ++-- .../ServerSentEventHttpMessageReader.java | 5 +++- .../http/codec/json/Jackson2CodecSupport.java | 5 ++++ .../http/codec/json/Jackson2JsonDecoder.java | 6 ++-- .../http/codec/json/Jackson2JsonEncoder.java | 4 +-- .../codec/json/Jackson2JsonDecoderTests.java | 24 ++++++++------- .../config/WebFluxConfigurationSupport.java | 2 +- .../DefaultExchangeStrategiesBuilder.java | 6 ++-- .../DefaultHandlerStrategiesBuilder.java | 2 +- .../RequestMappingHandlerAdapter.java | 3 +- .../WebFluxConfigurationSupportTests.java | 2 +- .../function/BodyExtractorsTests.java | 2 +- .../client/DefaultClientResponseTests.java | 10 +++---- .../server/DefaultServerRequestTests.java | 13 ++++---- .../HttpEntityArgumentResolverTests.java | 2 +- .../RequestBodyArgumentResolverTests.java | 2 +- 17 files changed, 75 insertions(+), 49 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java b/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java index bcfe7d7d5a..3f37933727 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java +++ b/spring-core/src/main/java/org/springframework/core/codec/StringDecoder.java @@ -58,21 +58,13 @@ public class StringDecoder extends AbstractDecoder { private final boolean splitOnNewline; - /** - * Create a {@code StringDecoder} that decodes a bytes stream to a String stream - *

By default, this decoder will split along new lines. - */ - public StringDecoder() { - this(true); - } - /** * Create a {@code StringDecoder} that decodes a bytes stream to a String stream * @param splitOnNewline whether this decoder should split the received data buffers * along newline characters */ - public StringDecoder(boolean splitOnNewline) { - super(new MimeType("text", "*", DEFAULT_CHARSET), MimeTypeUtils.ALL); + private StringDecoder(boolean splitOnNewline, MimeType... mimeTypes) { + super(mimeTypes); this.splitOnNewline = splitOnNewline; } @@ -136,4 +128,22 @@ public class StringDecoder extends AbstractDecoder { } } + + /** + * Create a {@code StringDecoder} for {@code "text/plain"}. + * @param splitOnNewline whether to split the byte stream into lines + */ + public static StringDecoder textPlainOnly(boolean splitOnNewline) { + return new StringDecoder(splitOnNewline, new MimeType("text", "plain", DEFAULT_CHARSET)); + } + + /** + * Create a {@code StringDecoder} that supports all MIME types. + * @param splitOnNewline whether to split the byte stream into lines + */ + public static StringDecoder allMimeTypes(boolean splitOnNewline) { + return new StringDecoder(splitOnNewline, + new MimeType("text", "plain", DEFAULT_CHARSET), MimeTypeUtils.ALL); + } + } diff --git a/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java b/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java index eeed3d438e..e71b7b5e75 100644 --- a/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java +++ b/spring-core/src/test/java/org/springframework/core/codec/StringDecoderTests.java @@ -38,7 +38,7 @@ import static org.junit.Assert.assertTrue; */ public class StringDecoderTests extends AbstractDataBufferAllocatingTestCase { - private StringDecoder decoder = new StringDecoder(); + private StringDecoder decoder = StringDecoder.allMimeTypes(true); @Test @@ -57,7 +57,7 @@ public class StringDecoderTests extends AbstractDataBufferAllocatingTestCase { @Test public void decode() throws InterruptedException { - this.decoder = new StringDecoder(false); + this.decoder = StringDecoder.allMimeTypes(false); Flux source = Flux.just(stringBuffer("foo"), stringBuffer("bar"), stringBuffer("baz")); Flux output = this.decoder.decode(source, ResolvableType.forClass(String.class), null, Collections.emptyMap()); @@ -111,7 +111,7 @@ public class StringDecoderTests extends AbstractDataBufferAllocatingTestCase { @Test public void decodeToMono() throws InterruptedException { - this.decoder = new StringDecoder(false); + this.decoder = StringDecoder.allMimeTypes(false); Flux source = Flux.just(stringBuffer("foo"), stringBuffer("bar"), stringBuffer("baz")); Mono output = this.decoder.decodeToMono(source, ResolvableType.forClass(String.class), null, Collections.emptyMap()); diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java index d0a4034df1..d4ae58c746 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageReader.java @@ -55,7 +55,7 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader decoder; @@ -190,6 +190,9 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader readMono(ResolvableType elementType, ReactiveHttpInputMessage message, Map hints) { + // We're ahead of String + "*/*" + // Let's see if we can aggregate the output (lest we time out)... + if (String.class.equals(elementType.getRawClass())) { Flux body = message.getBody(); return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class); diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2CodecSupport.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2CodecSupport.java index 2348844c77..a8db4a930d 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2CodecSupport.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2CodecSupport.java @@ -74,6 +74,11 @@ public abstract class Jackson2CodecSupport { } + protected boolean supportsMimeType(MimeType mimeType) { + return mimeType == null || + JSON_MIME_TYPES.stream().anyMatch(m -> m.isCompatibleWith(mimeType)); + } + /** * Return the Jackson {@link JavaType} for the specified type and context class. *

The default implementation returns {@code typeFactory.constructType(type, contextClass)}, diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java index 0efc204c5e..d3d2b94051 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java @@ -67,10 +67,12 @@ public class Jackson2JsonDecoder extends Jackson2CodecSupport implements HttpDec @Override public boolean canDecode(ResolvableType elementType, MimeType mimeType) { JavaType javaType = this.mapper.getTypeFactory().constructType(elementType.getType()); - return this.mapper.canDeserialize(javaType) && - (mimeType == null || JSON_MIME_TYPES.stream().anyMatch(m -> m.isCompatibleWith(mimeType))); + // Skip String (CharSequenceDecoder + "*/*" comes after) + return !CharSequence.class.isAssignableFrom(elementType.resolve(Object.class)) && + this.mapper.canDeserialize(javaType) && supportsMimeType(mimeType); } + @Override public List getDecodableMimeTypes() { return JSON_MIME_TYPES; diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java index ad63326ceb..26a712afc0 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java @@ -104,8 +104,8 @@ public class Jackson2JsonEncoder extends Jackson2CodecSupport implements HttpEnc @Override public boolean canEncode(ResolvableType elementType, MimeType mimeType) { - return this.mapper.canSerialize(elementType.getRawClass()) && - (mimeType == null || JSON_MIME_TYPES.stream().anyMatch(m -> m.isCompatibleWith(mimeType))); + Class clazz = elementType.getRawClass(); + return this.mapper.canSerialize(clazz) && supportsMimeType(mimeType); } @Override diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java index d26fefbec0..04524419c2 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java @@ -22,6 +22,8 @@ import java.util.Map; import static java.util.Arrays.asList; import static java.util.Collections.*; import org.junit.Test; + +import static org.springframework.core.ResolvableType.forClass; import static org.springframework.http.MediaType.*; import static org.springframework.http.codec.json.Jackson2JsonDecoder.*; import static org.springframework.http.codec.json.JacksonViewBean.*; @@ -50,16 +52,18 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa @Test public void canDecode() { Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(); - ResolvableType type = ResolvableType.forClass(Pojo.class); - assertTrue(decoder.canDecode(type, APPLICATION_JSON)); - assertTrue(decoder.canDecode(type, null)); - assertFalse(decoder.canDecode(type, APPLICATION_XML)); + + assertTrue(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON)); + assertTrue(decoder.canDecode(forClass(Pojo.class), null)); + + assertFalse(decoder.canDecode(forClass(String.class), null)); + assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML)); } @Test public void decodePojo() throws Exception { Flux source = Flux.just(stringBuffer("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}")); - ResolvableType elementType = ResolvableType.forClass(Pojo.class); + ResolvableType elementType = forClass(Pojo.class); Flux flux = new Jackson2JsonDecoder().decode(source, elementType, null, emptyMap()); @@ -71,7 +75,7 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa @Test public void decodePojoWithError() throws Exception { Flux source = Flux.just(stringBuffer("{\"foo\":}")); - ResolvableType elementType = ResolvableType.forClass(Pojo.class); + ResolvableType elementType = forClass(Pojo.class); Flux flux = new Jackson2JsonDecoder().decode(source, elementType, null, emptyMap()); @@ -98,7 +102,7 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa Flux source = Flux.just(stringBuffer( "[{\"bar\":\"b1\",\"foo\":\"f1\"},{\"bar\":\"b2\",\"foo\":\"f2\"}]")); - ResolvableType elementType = ResolvableType.forClass(Pojo.class); + ResolvableType elementType = forClass(Pojo.class); Flux flux = new Jackson2JsonDecoder().decode(source, elementType, null, emptyMap()); @@ -112,7 +116,7 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa public void fieldLevelJsonView() throws Exception { Flux source = Flux.just( stringBuffer("{\"withView1\" : \"with\", \"withView2\" : \"with\", \"withoutView\" : \"without\"}")); - ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class); + ResolvableType elementType = forClass(JacksonViewBean.class); Map hints = singletonMap(JSON_VIEW_HINT, MyJacksonView1.class); Flux flux = new Jackson2JsonDecoder() .decode(source, elementType, null, hints).cast(JacksonViewBean.class); @@ -130,7 +134,7 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa public void classLevelJsonView() throws Exception { Flux source = Flux.just(stringBuffer( "{\"withView1\" : \"with\", \"withView2\" : \"with\", \"withoutView\" : \"without\"}")); - ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class); + ResolvableType elementType = forClass(JacksonViewBean.class); Map hints = singletonMap(JSON_VIEW_HINT, MyJacksonView3.class); Flux flux = new Jackson2JsonDecoder() .decode(source, elementType, null, hints).cast(JacksonViewBean.class); @@ -147,7 +151,7 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa @Test public void decodeEmptyBodyToMono() throws Exception { Flux source = Flux.empty(); - ResolvableType elementType = ResolvableType.forClass(Pojo.class); + ResolvableType elementType = forClass(Pojo.class); Mono mono = new Jackson2JsonDecoder().decodeToMono(source, elementType, null, emptyMap()); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java index cd7f74a4d5..fc657dfa12 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java @@ -331,7 +331,7 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware { readers.add(new DecoderHttpMessageReader<>(new ByteArrayDecoder())); readers.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder())); readers.add(new DecoderHttpMessageReader<>(new DataBufferDecoder())); - readers.add(new DecoderHttpMessageReader<>(new StringDecoder())); + readers.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); readers.add(new DecoderHttpMessageReader<>(new ResourceDecoder())); if (jaxb2Present) { readers.add(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder())); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultExchangeStrategiesBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultExchangeStrategiesBuilder.java index 520f289962..52af484ec2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultExchangeStrategiesBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultExchangeStrategiesBuilder.java @@ -75,17 +75,17 @@ class DefaultExchangeStrategiesBuilder implements ExchangeStrategies.Builder { } private void defaultReaders() { - // SSE first (constrained to "text/event-stream") - messageReader(new ServerSentEventHttpMessageReader(getSseDecoder())); messageReader(new DecoderHttpMessageReader<>(new ByteArrayDecoder())); messageReader(new DecoderHttpMessageReader<>(new ByteBufferDecoder())); - messageReader(new DecoderHttpMessageReader<>(new StringDecoder(false))); + messageReader(new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(false))); if (jaxb2Present) { messageReader(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder())); } if (jackson2Present) { messageReader(new DecoderHttpMessageReader<>(new Jackson2JsonDecoder())); } + messageReader(new ServerSentEventHttpMessageReader(getSseDecoder())); + messageReader(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(false))); } private Decoder getSseDecoder() { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultHandlerStrategiesBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultHandlerStrategiesBuilder.java index 497ea63314..218b8df555 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultHandlerStrategiesBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultHandlerStrategiesBuilder.java @@ -84,7 +84,7 @@ class DefaultHandlerStrategiesBuilder implements HandlerStrategies.Builder { public void defaultConfiguration() { messageReader(new DecoderHttpMessageReader<>(new ByteArrayDecoder())); messageReader(new DecoderHttpMessageReader<>(new ByteBufferDecoder())); - messageReader(new DecoderHttpMessageReader<>(new StringDecoder())); + messageReader(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); messageReader(new FormHttpMessageReader()); messageWriter(new EncoderHttpMessageWriter<>(new ByteArrayEncoder())); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java index 5a4a95f44a..dbed19a45c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java @@ -114,10 +114,11 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application public RequestMappingHandlerAdapter() { + // TODO: improve with better (shared) defaults this.messageReaders.add(new DecoderHttpMessageReader<>(new ByteArrayDecoder())); this.messageReaders.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder())); this.messageReaders.add(new DecoderHttpMessageReader<>(new DataBufferDecoder())); - this.messageReaders.add(new DecoderHttpMessageReader<>(new StringDecoder())); + this.messageReaders.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java index 8ea4b4cbd1..99919d89e3 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java @@ -298,7 +298,7 @@ public class WebFluxConfigurationSupportTests { @Override protected void configureMessageReaders(List> messageReaders) { - messageReaders.add(new DecoderHttpMessageReader<>(new StringDecoder())); + messageReaders.add(new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); } @Override diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java index 6e0c46064a..b47787f7ee 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java @@ -67,7 +67,7 @@ public class BodyExtractorsTests { public void createContext() { final List> messageReaders = new ArrayList<>(); messageReaders.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder())); - messageReaders.add(new DecoderHttpMessageReader<>(new StringDecoder())); + messageReaders.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); messageReaders.add(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder())); messageReaders.add(new DecoderHttpMessageReader<>(new Jackson2JsonDecoder())); messageReaders.add(new FormHttpMessageReader()); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java index b72b5513cc..813d6566a1 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java @@ -123,7 +123,7 @@ public class DefaultClientResponseTests { when(mockResponse.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockExchangeStrategies.messageReaders()).thenReturn(messageReaders::stream); Mono resultMono = defaultClientResponse.body(toMono(String.class)); @@ -144,7 +144,7 @@ public class DefaultClientResponseTests { when(mockResponse.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockExchangeStrategies.messageReaders()).thenReturn(messageReaders::stream); Mono resultMono = defaultClientResponse.bodyToMono(String.class); @@ -159,7 +159,7 @@ public class DefaultClientResponseTests { when(mockResponse.getStatusCode()).thenReturn(HttpStatus.NOT_FOUND); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockExchangeStrategies.messageReaders()).thenReturn(messageReaders::stream); Mono resultMono = defaultClientResponse.bodyToMono(String.class); @@ -183,7 +183,7 @@ public class DefaultClientResponseTests { when(mockResponse.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockExchangeStrategies.messageReaders()).thenReturn(messageReaders::stream); Flux resultFlux = defaultClientResponse.bodyToFlux(String.class); @@ -199,7 +199,7 @@ public class DefaultClientResponseTests { when(mockResponse.getStatusCode()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockExchangeStrategies.messageReaders()).thenReturn(messageReaders::stream); Flux resultFlux = defaultClientResponse.bodyToFlux(String.class); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java index 5bc364f5a8..65a2cd58eb 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java @@ -52,9 +52,10 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.UnsupportedMediaTypeStatusException; import org.springframework.web.server.WebSession; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import static org.springframework.web.reactive.function.BodyExtractors.*; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.springframework.web.reactive.function.BodyExtractors.toMono; /** * @author Arjen Poutsma @@ -190,7 +191,7 @@ public class DefaultServerRequestTests { when(mockRequest.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockHandlerStrategies.messageReaders()).thenReturn(messageReaders::stream); Mono resultMono = defaultRequest.body(toMono(String.class)); @@ -210,7 +211,7 @@ public class DefaultServerRequestTests { when(mockRequest.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockHandlerStrategies.messageReaders()).thenReturn(messageReaders::stream); Mono resultMono = defaultRequest.bodyToMono(String.class); @@ -230,7 +231,7 @@ public class DefaultServerRequestTests { when(mockRequest.getBody()).thenReturn(body); Set> messageReaders = Collections - .singleton(new DecoderHttpMessageReader(new StringDecoder())); + .singleton(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); when(mockHandlerStrategies.messageReaders()).thenReturn(messageReaders::stream); Flux resultFlux = defaultRequest.bodyToFlux(String.class); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/HttpEntityArgumentResolverTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/HttpEntityArgumentResolverTests.java index 98e7f9ba0c..05bcc3d4c1 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/HttpEntityArgumentResolverTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/HttpEntityArgumentResolverTests.java @@ -74,7 +74,7 @@ public class HttpEntityArgumentResolverTests { private HttpEntityArgumentResolver createResolver() { List> readers = new ArrayList<>(); - readers.add(new DecoderHttpMessageReader<>(new StringDecoder())); + readers.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); return new HttpEntityArgumentResolver(readers, new ReactiveAdapterRegistry()); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestBodyArgumentResolverTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestBodyArgumentResolverTests.java index fa65584af3..880e64f8e5 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestBodyArgumentResolverTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestBodyArgumentResolverTests.java @@ -67,7 +67,7 @@ public class RequestBodyArgumentResolverTests { @Before public void setup() { List> readers = new ArrayList<>(); - readers.add(new DecoderHttpMessageReader<>(new StringDecoder())); + readers.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); this.resolver = new RequestBodyArgumentResolver(readers, new ReactiveAdapterRegistry()); }