diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java index c2b6bf90b52..6f5c58563ef 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java @@ -109,6 +109,8 @@ public class ServerCodecConfigurer { this.defaultCodecs.addReaderTo(result, ResourceDecoder.class, ResourceDecoder::new); this.defaultCodecs.addStringReaderTextOnlyTo(result); + this.defaultCodecs.addReaderTo(result, FormHttpMessageReader::new); + // Custom, concrete Java type readers this.customCodecs.addTypedReadersTo(result); diff --git a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java index b9ed7694d30..d33087b7230 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java @@ -61,12 +61,13 @@ public class ServerCodecConfigurerTests { @Test public void defaultReaders() throws Exception { List> readers = this.configurer.getReaders(); - assertEquals(8, readers.size()); + assertEquals(9, readers.size()); assertEquals(ByteArrayDecoder.class, getNextDecoder(readers).getClass()); assertEquals(ByteBufferDecoder.class, getNextDecoder(readers).getClass()); assertEquals(DataBufferDecoder.class, getNextDecoder(readers).getClass()); assertEquals(ResourceDecoder.class, getNextDecoder(readers).getClass()); assertStringDecoder(getNextDecoder(readers), true); + assertEquals(FormHttpMessageReader.class, readers.get(this.index.getAndIncrement()).getClass()); assertEquals(Jaxb2XmlDecoder.class, getNextDecoder(readers).getClass()); assertEquals(Jackson2JsonDecoder.class, getNextDecoder(readers).getClass()); assertStringDecoder(getNextDecoder(readers), false); @@ -110,12 +111,13 @@ public class ServerCodecConfigurerTests { List> readers = this.configurer.getReaders(); - assertEquals(12, readers.size()); + assertEquals(13, readers.size()); assertEquals(ByteArrayDecoder.class, getNextDecoder(readers).getClass()); assertEquals(ByteBufferDecoder.class, getNextDecoder(readers).getClass()); assertEquals(DataBufferDecoder.class, getNextDecoder(readers).getClass()); assertEquals(ResourceDecoder.class, getNextDecoder(readers).getClass()); assertEquals(StringDecoder.class, getNextDecoder(readers).getClass()); + assertEquals(FormHttpMessageReader.class, readers.get(this.index.getAndIncrement()).getClass()); assertSame(customDecoder1, getNextDecoder(readers)); assertSame(customReader1, readers.get(this.index.getAndIncrement())); assertEquals(Jaxb2XmlDecoder.class, getNextDecoder(readers).getClass()); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java index 403ffd2c15d..b95cc46bfca 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java @@ -103,7 +103,7 @@ public class DelegatingWebFluxConfigurationTests { verify(webFluxConfigurer).addArgumentResolvers(any()); assertSame(formatterRegistry.getValue(), initializerConversionService); - assertEquals(8, codecsConfigurer.getValue().getReaders().size()); + assertEquals(9, codecsConfigurer.getValue().getReaders().size()); } @Test 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 715f569720c..17013136e76 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 @@ -43,6 +43,7 @@ import org.springframework.http.codec.xml.Jaxb2XmlEncoder; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; +import org.springframework.util.MultiValueMap; import org.springframework.validation.Validator; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.bind.support.WebExchangeDataBinder; @@ -67,11 +68,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM; -import static org.springframework.http.MediaType.APPLICATION_XML; -import static org.springframework.http.MediaType.IMAGE_PNG; -import static org.springframework.http.MediaType.TEXT_PLAIN; +import static org.springframework.core.ResolvableType.*; +import static org.springframework.http.MediaType.*; /** * Unit tests for {@link WebFluxConfigurationSupport}. @@ -127,15 +125,16 @@ public class WebFluxConfigurationSupportTests { assertNotNull(adapter); List> readers = adapter.getMessageReaders(); - assertEquals(8, readers.size()); + assertEquals(9, readers.size()); - assertHasMessageReader(readers, byte[].class, APPLICATION_OCTET_STREAM); - assertHasMessageReader(readers, ByteBuffer.class, APPLICATION_OCTET_STREAM); - assertHasMessageReader(readers, String.class, TEXT_PLAIN); - assertHasMessageReader(readers, Resource.class, IMAGE_PNG); - assertHasMessageReader(readers, TestBean.class, APPLICATION_XML); - assertHasMessageReader(readers, TestBean.class, APPLICATION_JSON); - assertHasMessageReader(readers, TestBean.class, null); + assertHasMessageReader(readers, forClass(byte[].class), APPLICATION_OCTET_STREAM); + assertHasMessageReader(readers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM); + assertHasMessageReader(readers, forClass(String.class), TEXT_PLAIN); + assertHasMessageReader(readers, forClass(Resource.class), IMAGE_PNG); + assertHasMessageReader(readers, forClassWithGenerics(MultiValueMap.class, String.class, String.class), APPLICATION_FORM_URLENCODED); + assertHasMessageReader(readers, forClass(TestBean.class), APPLICATION_XML); + assertHasMessageReader(readers, forClass(TestBean.class), APPLICATION_JSON); + assertHasMessageReader(readers, forClass(TestBean.class), null); WebBindingInitializer bindingInitializer = adapter.getWebBindingInitializer(); assertNotNull(bindingInitializer); @@ -162,8 +161,8 @@ public class WebFluxConfigurationSupportTests { List> messageReaders = adapter.getMessageReaders(); assertEquals(2, messageReaders.size()); - assertHasMessageReader(messageReaders, String.class, TEXT_PLAIN); - assertHasMessageReader(messageReaders, TestBean.class, APPLICATION_XML); + assertHasMessageReader(messageReaders, forClass(String.class), TEXT_PLAIN); + assertHasMessageReader(messageReaders, forClass(TestBean.class), APPLICATION_XML); } @Test @@ -179,13 +178,13 @@ public class WebFluxConfigurationSupportTests { List> writers = handler.getMessageWriters(); assertEquals(9, writers.size()); - assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM); - assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM); - assertHasMessageWriter(writers, String.class, TEXT_PLAIN); - assertHasMessageWriter(writers, Resource.class, IMAGE_PNG); - assertHasMessageWriter(writers, TestBean.class, APPLICATION_XML); - assertHasMessageWriter(writers, TestBean.class, APPLICATION_JSON); - assertHasMessageWriter(writers, TestBean.class, MediaType.parseMediaType("text/event-stream")); + assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM); + assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM); + assertHasMessageWriter(writers, forClass(String.class), TEXT_PLAIN); + assertHasMessageWriter(writers, forClass(Resource.class), IMAGE_PNG); + assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_XML); + assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_JSON); + assertHasMessageWriter(writers, forClass(TestBean.class), MediaType.parseMediaType("text/event-stream")); name = "webFluxContentTypeResolver"; RequestedContentTypeResolver resolver = context.getBean(name, RequestedContentTypeResolver.class); @@ -205,13 +204,13 @@ public class WebFluxConfigurationSupportTests { List> writers = handler.getMessageWriters(); assertEquals(9, writers.size()); - assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM); - assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM); - assertHasMessageWriter(writers, String.class, TEXT_PLAIN); - assertHasMessageWriter(writers, Resource.class, IMAGE_PNG); - assertHasMessageWriter(writers, TestBean.class, APPLICATION_XML); - assertHasMessageWriter(writers, TestBean.class, APPLICATION_JSON); - assertHasMessageWriter(writers, TestBean.class, null); + assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM); + assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM); + assertHasMessageWriter(writers, forClass(String.class), TEXT_PLAIN); + assertHasMessageWriter(writers, forClass(Resource.class), IMAGE_PNG); + assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_XML); + assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_JSON); + assertHasMessageWriter(writers, forClass(TestBean.class), null); name = "webFluxContentTypeResolver"; RequestedContentTypeResolver resolver = context.getBean(name, RequestedContentTypeResolver.class); @@ -258,13 +257,11 @@ public class WebFluxConfigurationSupportTests { } - private void assertHasMessageReader(List> readers, Class clazz, MediaType mediaType) { - ResolvableType type = ResolvableType.forClass(clazz); + private void assertHasMessageReader(List> readers, ResolvableType type, MediaType mediaType) { assertTrue(readers.stream().anyMatch(c -> mediaType == null || c.canRead(type, mediaType))); } - private void assertHasMessageWriter(List> writers, Class clazz, MediaType mediaType) { - ResolvableType type = ResolvableType.forClass(clazz); + private void assertHasMessageWriter(List> writers, ResolvableType type, MediaType mediaType) { assertTrue(writers.stream().anyMatch(c -> mediaType == null || c.canWrite(type, mediaType))); }