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()); }