From 1c15bc1ac091b12f6e0b3a15ab1582c28acbb320 Mon Sep 17 00:00:00 2001 From: CoderYellow Date: Sat, 3 Dec 2022 23:05:38 +0800 Subject: [PATCH 1/3] Fix supported type for PartHttpMessageWriter --- .../codec/multipart/PartHttpMessageWriter.java | 15 +++++++++++++++ .../multipart/PartHttpMessageWriterTests.java | 13 +++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java index 309b0fc6a418..1ba4349ccf44 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java @@ -48,6 +48,21 @@ public PartHttpMessageWriter() { super(MultipartHttpMessageReader.MIME_TYPES); } + @Override + public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { + if (Flux.class.isAssignableFrom(elementType.toClass())) { + if (mediaType == null) { + return true; + } + for (MediaType supportedMediaType : getWritableMediaTypes()) { + if (supportedMediaType.isCompatibleWith(mediaType)) { + return true; + } + } + } + return false; + } + @Override public Mono write(Publisher parts, diff --git a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java index f03befb12778..f9ad7b487ff9 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java @@ -53,21 +53,14 @@ public class PartHttpMessageWriterTests extends AbstractLeakCheckingTests { @Test public void canWrite() { assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), + ResolvableType.forClassWithGenerics(Flux.class, Part.class), MediaType.MULTIPART_FORM_DATA)).isTrue(); assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class), - MediaType.MULTIPART_FORM_DATA)).isTrue(); - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), + ResolvableType.forClassWithGenerics(Flux.class, Part.class), MediaType.MULTIPART_MIXED)).isTrue(); assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), + ResolvableType.forClassWithGenerics(Flux.class, Part.class), MediaType.MULTIPART_RELATED)).isTrue(); - - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(Map.class, String.class, Object.class), - MediaType.MULTIPART_FORM_DATA)).isFalse(); } @Test From 053ad8b76d71c8f4c341e6ac83c14d08575fd994 Mon Sep 17 00:00:00 2001 From: CoderYellow Date: Sun, 4 Dec 2022 10:34:13 +0800 Subject: [PATCH 2/3] Correct response type checking --- .../http/codec/multipart/PartHttpMessageWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java index 1ba4349ccf44..ddf92c14caa3 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartHttpMessageWriter.java @@ -50,7 +50,7 @@ public PartHttpMessageWriter() { @Override public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { - if (Flux.class.isAssignableFrom(elementType.toClass())) { + if (Part.class.isAssignableFrom(elementType.toClass())) { if (mediaType == null) { return true; } From aef78cf5fe9e886c3d0e514e1be9bf1d6cb8939f Mon Sep 17 00:00:00 2001 From: CoderYellow Date: Sun, 4 Dec 2022 16:54:57 +0800 Subject: [PATCH 3/3] Fix unit test --- .../codec/multipart/PartHttpMessageWriterTests.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java index f9ad7b487ff9..1b46417aa895 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartHttpMessageWriterTests.java @@ -52,15 +52,9 @@ public class PartHttpMessageWriterTests extends AbstractLeakCheckingTests { @Test public void canWrite() { - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(Flux.class, Part.class), - MediaType.MULTIPART_FORM_DATA)).isTrue(); - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(Flux.class, Part.class), - MediaType.MULTIPART_MIXED)).isTrue(); - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(Flux.class, Part.class), - MediaType.MULTIPART_RELATED)).isTrue(); + assertThat(this.writer.canWrite(ResolvableType.forClass(Part.class), MediaType.MULTIPART_FORM_DATA)).isTrue(); + assertThat(this.writer.canWrite(ResolvableType.forClass(Part.class), MediaType.MULTIPART_MIXED)).isTrue(); + assertThat(this.writer.canWrite(ResolvableType.forClass(Part.class), MediaType.MULTIPART_RELATED)).isTrue(); } @Test