From 2962f085e508b066ad33c7285178ba2d2b7095bc Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Thu, 12 Oct 2017 17:48:42 +0200 Subject: [PATCH] Relax type check in FormHttpMessage(Reader|Writer) Issue: SPR-16055 --- .../springframework/http/codec/FormHttpMessageReader.java | 5 +++-- .../springframework/http/codec/FormHttpMessageWriter.java | 3 ++- .../http/codec/FormHttpMessageReaderTests.java | 5 +++++ .../http/codec/FormHttpMessageWriterTests.java | 4 ++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageReader.java b/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageReader.java index e3626d099112..ff58e9e5afcb 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageReader.java +++ b/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageReader.java @@ -77,8 +77,9 @@ public Charset getDefaultCharset() { @Override public boolean canRead(ResolvableType elementType, @Nullable MediaType mediaType) { - return (MULTIVALUE_TYPE.isAssignableFrom(elementType) && - (mediaType == null || MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType))); + return (MULTIVALUE_TYPE.isAssignableFrom(elementType) || + (elementType.hasUnresolvableGenerics() && MultiValueMap.class.isAssignableFrom(elementType.resolve()))) && + (mediaType == null || MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)); } @Override diff --git a/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java index 5140c08eee23..6ef33124e654 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageWriter.java @@ -77,7 +77,8 @@ public Charset getDefaultCharset() { @Override public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { - return MULTIVALUE_TYPE.isAssignableFrom(elementType) && + return (MULTIVALUE_TYPE.isAssignableFrom(elementType) || + (elementType.hasUnresolvableGenerics() && MultiValueMap.class.isAssignableFrom(elementType.resolve()))) && (mediaType == null || MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)); } diff --git a/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageReaderTests.java b/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageReaderTests.java index 2da57b10acb6..55466f255a8f 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageReaderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageReaderTests.java @@ -27,6 +27,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; /** @@ -42,6 +43,10 @@ public void canRead() { ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class), MediaType.APPLICATION_FORM_URLENCODED)); + assertTrue(this.reader.canRead( + ResolvableType.forInstance(new LinkedMultiValueMap()), + MediaType.APPLICATION_FORM_URLENCODED)); + assertFalse(this.reader.canRead( ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), MediaType.APPLICATION_FORM_URLENCODED)); diff --git a/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageWriterTests.java b/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageWriterTests.java index dd1c9c9d2db1..1bd1fff36134 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageWriterTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageWriterTests.java @@ -44,6 +44,10 @@ public void canWrite() { ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class), MediaType.APPLICATION_FORM_URLENCODED)); + assertTrue(this.writer.canWrite( + ResolvableType.forInstance(new LinkedMultiValueMap()), + MediaType.APPLICATION_FORM_URLENCODED)); + assertFalse(this.writer.canWrite( ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), MediaType.APPLICATION_FORM_URLENCODED));