From 7299ff9326636d8dd04c6a5226d9cae8a6faf994 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 23 Feb 2026 11:02:22 +0100 Subject: [PATCH] Improve ResourceHttpMessageConverter target type support This commit updates the target type detection in `ResourceHttpMessageConverter` to only support target types that are relevant: `InputStreamResource` for streaming, and types assignable from `ByteArrayResource` for non-streaming cases. Closes gh-36368 --- .../ResourceHttpMessageConverter.java | 2 +- .../ResourceHttpMessageConverterTests.java | 44 ++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java index e4ce4097520..6ffb2f7d72a 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java @@ -93,7 +93,7 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter + converter.read(CustomResource.class, inputMessage)); + } + @Test // SPR-13443 public void shouldReadInputStreamResource() throws IOException { try (InputStream body = getClass().getResourceAsStream("logo.jpg") ) { @@ -100,6 +115,16 @@ class ResourceHttpMessageConverterTests { } } + @Test // gh-36368 + public void shouldNotReadStreamResourceAsUnknownType() throws IOException { + try (InputStream body = getClass().getResourceAsStream("logo.jpg") ) { + MockHttpInputMessage inputMessage = new MockHttpInputMessage(body); + inputMessage.getHeaders().setContentType(MediaType.IMAGE_JPEG); + assertThatExceptionOfType(HttpMessageNotReadableException.class).isThrownBy(() -> + converter.read(CustomStreamResource.class, inputMessage)); + } + } + @Test void shouldWriteImageResource() throws IOException { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); @@ -157,4 +182,19 @@ class ResourceHttpMessageConverterTests { assertThat(outputMessage.getHeaders().getContentLength()).isEqualTo(0); } + static class CustomStreamResource extends InputStreamResource { + + public CustomStreamResource(InputStreamSource inputStreamSource) { + super(inputStreamSource); + } + + } + + static class CustomResource extends ByteArrayResource { + + public CustomResource(byte[] byteArray) { + super(byteArray); + } + } + }