From 46ceedf9924ef36635bec76623f86534aaaffbf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Thu, 27 Nov 2025 16:39:16 +0100 Subject: [PATCH] Refine AbstractKotlinSerializationHttpMessageConverter#canWrite AbstractKotlinSerializationHttpMessageConverter#writeInternal is able to resolve the ResolvableType from the Object parameter when the provided one via the ResolvableType parameter is not resolvable, but AbstractKotlinSerializationHttpMessageConverter#canWrite lacks of such capability. This commit refines AbstractKotlinSerializationHttpMessageConverter#canWrite to resolve the ResolvableType from the Class parameter when the provided one via the ResolvableType parameter is not resolvable. Closes gh-35920 --- .../AbstractKotlinSerializationHttpMessageConverter.java | 7 ++++--- .../KotlinSerializationJsonHttpMessageConverterTests.kt | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractKotlinSerializationHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractKotlinSerializationHttpMessageConverter.java index 21c6e868321..c49057a7ace 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractKotlinSerializationHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractKotlinSerializationHttpMessageConverter.java @@ -112,11 +112,12 @@ public abstract class AbstractKotlinSerializationHttpMessageConverter clazz, @Nullable MediaType mediaType) { - if (!this.typePredicate.test(type) || ResolvableType.NONE.equals(type)) { + public boolean canWrite(ResolvableType type, Class valueClass, @Nullable MediaType mediaType) { + ResolvableType resolvableType = (ResolvableType.NONE.equals(type) ? ResolvableType.forClass(valueClass) : type); + if (!this.typePredicate.test(resolvableType)) { return false; } - return serializer(type, null) != null && canWrite(mediaType); + return serializer(resolvableType, null) != null && canWrite(mediaType); } @Override diff --git a/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt b/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt index 6d1cde38991..af15a1a151c 100644 --- a/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt @@ -128,7 +128,7 @@ class KotlinSerializationJsonHttpMessageConverterTests { assertThat(converter.canWrite(resolvableTypeOf(), Ordered::class.java, MediaType.APPLICATION_JSON)).isFalse() assertThat(converter.canWrite(resolvableTypeOf(), OrderedImpl::class.java, MediaType.APPLICATION_JSON)).isFalse() - assertThat(converter.canWrite(ResolvableType.NONE, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isFalse() + assertThat(converter.canWrite(ResolvableType.NONE, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isTrue() assertThat(converter.canWrite(ResolvableType.forType(BigDecimal::class.java), BigDecimal::class.java, MediaType.APPLICATION_JSON)).isFalse() } @@ -156,7 +156,7 @@ class KotlinSerializationJsonHttpMessageConverterTests { assertThat(converterWithAllTypes.canWrite(resolvableTypeOf(), Ordered::class.java, MediaType.APPLICATION_JSON)).isTrue() assertThat(converterWithAllTypes.canWrite(resolvableTypeOf(), OrderedImpl::class.java, MediaType.APPLICATION_JSON)).isFalse() - assertThat(converterWithAllTypes.canWrite(ResolvableType.NONE, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isFalse() + assertThat(converterWithAllTypes.canWrite(ResolvableType.NONE, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isTrue() assertThat(converterWithAllTypes.canWrite(ResolvableType.forType(BigDecimal::class.java), BigDecimal::class.java, MediaType.APPLICATION_JSON)).isFalse() }