From 93ea2e1df95eeb00f2475c7a5360c4a293a490ab Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 5 Dec 2022 15:22:37 +0000 Subject: [PATCH] Push canWrite down into MultipartHttpMessageWriter The implementation in the base class only matches the MultipartHttpMessageWriter subclass. The other two override it anyway. Closes gh-29631 --- .../multipart/MultipartHttpMessageWriter.java | 14 ++++++++++++++ .../codec/multipart/MultipartWriterSupport.java | 17 ----------------- .../multipart/PartHttpMessageWriterTests.java | 1 + 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java index 4eced82403d3..777b5991ab86 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java @@ -145,6 +145,20 @@ public HttpMessageWriter> getFormWriter() { } + @Override + public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { + if (MultiValueMap.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> inputStream, diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java index 0bd3bfa23069..9e78ab9a9e9b 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java @@ -24,7 +24,6 @@ import reactor.core.publisher.Mono; -import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.HttpHeaders; @@ -34,7 +33,6 @@ import org.springframework.util.Assert; import org.springframework.util.FastByteArrayOutputStream; import org.springframework.util.MimeTypeUtils; -import org.springframework.util.MultiValueMap; /** * Support class for multipart HTTP message writers. @@ -83,21 +81,6 @@ public List getWritableMediaTypes() { return this.supportedMediaTypes; } - - public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) { - if (MultiValueMap.class.isAssignableFrom(elementType.toClass())) { - if (mediaType == null) { - return true; - } - for (MediaType supportedMediaType : this.supportedMediaTypes) { - if (supportedMediaType.isCompatibleWith(mediaType)) { - return true; - } - } - } - return false; - } - /** * Generate a multipart boundary. *

By default delegates to {@link MimeTypeUtils#generateMultipartBoundary()}. 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 1b46417aa895..b9f452a27b78 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 @@ -55,6 +55,7 @@ public void canWrite() { 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(); + assertThat(this.writer.canWrite(ResolvableType.forClass(MultiValueMap.class), MediaType.MULTIPART_FORM_DATA)).isFalse(); } @Test