From a7bf14b3641e9147881336a81bae5b1008db29b8 Mon Sep 17 00:00:00 2001 From: CoderYellow Date: Sun, 4 Dec 2022 16:54:57 +0800 Subject: [PATCH] Fix canWrite of PartHttpMessageWriter See gh-29631 --- .../multipart/PartHttpMessageWriter.java | 15 +++++++++++++++ .../multipart/PartHttpMessageWriterTests.java | 19 +++---------------- 2 files changed, 18 insertions(+), 16 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..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 @@ -48,6 +48,21 @@ public PartHttpMessageWriter() { super(MultipartHttpMessageReader.MIME_TYPES); } + @Override + public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { + if (Part.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..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,22 +52,9 @@ public class PartHttpMessageWriterTests extends AbstractLeakCheckingTests { @Test public void canWrite() { - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.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), - MediaType.MULTIPART_MIXED)).isTrue(); - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, Object.class), - MediaType.MULTIPART_RELATED)).isTrue(); - - assertThat(this.writer.canWrite( - ResolvableType.forClassWithGenerics(Map.class, String.class, Object.class), - MediaType.MULTIPART_FORM_DATA)).isFalse(); + 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