From 00b9063e7dca0d09c5fe2e2bc100380695c41e0d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 11 Aug 2026 23:48:56 +0200 Subject: [PATCH] Polishing --- .../ByteArrayHttpMessageConverter.java | 10 +++--- .../http/converter/HttpMessageConverter.java | 36 +++++++++---------- .../ResourceHttpMessageConverter.java | 10 +++--- .../ResourceRegionHttpMessageConverter.java | 20 +++++------ .../converter/StringHttpMessageConverter.java | 32 ++++++++--------- .../AbstractWireFeedHttpMessageConverter.java | 10 +++--- .../json/GsonHttpMessageConverter.java | 9 ++--- .../json/JsonbHttpMessageConverter.java | 9 ++--- .../ProtobufHttpMessageConverter.java | 15 ++++---- .../xml/SourceHttpMessageConverter.java | 10 +++--- 10 files changed, 80 insertions(+), 81 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java index 3a1926aa277..bdb882b3125 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ByteArrayHttpMessageConverter.java @@ -50,11 +50,6 @@ public class ByteArrayHttpMessageConverter extends AbstractHttpMessageConverter< return byte[].class == clazz; } - @Override - public boolean canWriteRepeatedly(byte[] bytes, @Nullable MediaType contentType) { - return true; - } - @Override public byte[] readInternal(Class clazz, HttpInputMessage message) throws IOException { long length = message.getHeaders().getContentLength(); @@ -72,6 +67,11 @@ public class ByteArrayHttpMessageConverter extends AbstractHttpMessageConverter< outputMessage.getBody().write(bytes); } + @Override + public boolean canWriteRepeatedly(byte[] bytes, @Nullable MediaType contentType) { + return true; + } + @Override @SuppressWarnings("removal") protected boolean supportsRepeatableWrites(byte[] bytes) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java index b7adaeb3492..2a414021e3b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java @@ -56,6 +56,24 @@ public interface HttpMessageConverter { */ boolean canWrite(Class clazz, @Nullable MediaType mediaType); + /** + * Indicates whether this message converter can + * {@linkplain #write(Object, MediaType, HttpOutputMessage) write} the + * given payload multiple times. + *

This can be used by HTTP client libraries to know whether a message can be + * sent again, for example after an HTTP redirect. The default implementation + * returns {@code false}. This typically returns false if the payload can be read + * only once. + * @param t the object t + * @param contentType the content type to use when writing. + * @return {@code true} if {@code t} can be written repeatedly; + * {@code false} otherwise + * @since 7.1 + */ + default boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { + return false; + } + /** * Return the list of media types supported by this converter. The list may * not apply to every possible target element type and calls to this method @@ -108,22 +126,4 @@ public interface HttpMessageConverter { void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; - /** - * Indicates whether this message converter can - * {@linkplain #write(Object, MediaType, HttpOutputMessage) write} the - * given payload multiple times. - *

This can be used by HTTP client libraries to know whether a message can be - * sent again, for example after an HTTP redirect. The default implementation - * returns {@code false}. This typically returns false if the payload can be read - * only once. - * @param t the object t - * @param contentType the content type to use when writing. - * @return {@code true} if {@code t} can be written repeatedly; - * {@code false} otherwise - * @since 7.1 - */ - default boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { - return false; - } - } 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 0faea6dc8a5..7fbfa28417e 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 @@ -71,11 +71,6 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter clazz) { return Resource.class.isAssignableFrom(clazz); @@ -145,6 +140,11 @@ public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); @@ -104,12 +99,15 @@ public class StringHttpMessageConverter extends AbstractHttpMessageConverterBy default, returns {@link Charset#availableCharsets()}. @@ -165,6 +158,11 @@ public class StringHttpMessageConverter extends AbstractHttpMessageConverter } - @Override - public boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { - return true; - } - @Override @SuppressWarnings("unchecked") protected T readInternal(Class clazz, HttpInputMessage inputMessage) @@ -113,6 +108,11 @@ public abstract class AbstractWireFeedHttpMessageConverter } } + @Override + public boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { + return true; + } + @Override @SuppressWarnings("removal") protected boolean supportsRepeatableWrites(T t) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/GsonHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/GsonHttpMessageConverter.java index dd617cc1e2e..5025e32c79a 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/GsonHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/GsonHttpMessageConverter.java @@ -87,10 +87,6 @@ public class GsonHttpMessageConverter extends AbstractJsonHttpMessageConverter { return this.gson; } - @Override - public boolean canWriteRepeatedly(Object o, @Nullable MediaType contentType) { - return true; - } @Override protected Object readInternal(Type resolvedType, Reader reader) throws Exception { @@ -112,6 +108,11 @@ public class GsonHttpMessageConverter extends AbstractJsonHttpMessageConverter { } } + @Override + public boolean canWriteRepeatedly(Object o, @Nullable MediaType contentType) { + return true; + } + @Override @SuppressWarnings("removal") protected boolean supportsRepeatableWrites(Object o) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/JsonbHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/JsonbHttpMessageConverter.java index 8dbe8484bc4..1dd630a8ddc 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/JsonbHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/JsonbHttpMessageConverter.java @@ -96,10 +96,6 @@ public class JsonbHttpMessageConverter extends AbstractJsonHttpMessageConverter return this.jsonb; } - @Override - public boolean canWriteRepeatedly(Object o, @Nullable MediaType contentType) { - return true; - } @Override protected Object readInternal(Type resolvedType, Reader reader) throws Exception { @@ -116,6 +112,11 @@ public class JsonbHttpMessageConverter extends AbstractJsonHttpMessageConverter } } + @Override + public boolean canWriteRepeatedly(Object o, @Nullable MediaType contentType) { + return true; + } + @Override @SuppressWarnings("removal") protected boolean supportsRepeatableWrites(Object o) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverter.java index 8e4b12767e5..05e86b5425f 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverter.java @@ -98,13 +98,13 @@ public class ProtobufHttpMessageConverter extends AbstractHttpMessageConverter, Method> methodCache = new ConcurrentReferenceHashMap<>(); + private final ProtobufHttpMessageConverter.@Nullable ProtobufFormatDelegate protobufFormatDelegate; final ExtensionRegistry extensionRegistry; - private final ProtobufHttpMessageConverter.@Nullable ProtobufFormatDelegate protobufFormatDelegate; - /** * Construct a new {@code ProtobufHttpMessageConverter}. @@ -122,12 +122,6 @@ public class ProtobufHttpMessageConverter extends AbstractHttpMessageConverter extends AbstractHttpMe return SUPPORTED_CLASSES.contains(clazz); } - @Override - public boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { - return t instanceof DOMSource; - } - @Override @SuppressWarnings("unchecked") protected T readInternal(Class clazz, HttpInputMessage inputMessage) @@ -325,6 +320,11 @@ public class SourceHttpMessageConverter extends AbstractHttpMe this.transformerFactory.newTransformer().transform(source, result); } + @Override + public boolean canWriteRepeatedly(T t, @Nullable MediaType contentType) { + return (t instanceof DOMSource); + } + @Override @SuppressWarnings("removal") protected boolean supportsRepeatableWrites(T t) {