Refine Kotlin Serialization codec type checks

ServerSentEvent and String checks, removed from
KotlinSerializationSupport in Spring Framework 7.0, are reintroduced by
this commit at the right level (KotlinSerializationSupport for
ServerSentEvent and KotlinSerializationString(Decoder|Encoder) for
String).

Closes gh-35885
This commit is contained in:
Sébastien Deleuze
2025-11-25 13:31:39 +01:00
parent f3908832c5
commit 4ee0a8ee33
5 changed files with 5 additions and 5 deletions
@@ -102,7 +102,7 @@ public abstract class KotlinSerializationStringDecoder<T extends StringFormat> e
@Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
return canSerialize(elementType, mimeType);
return canSerialize(elementType, mimeType) && !CharSequence.class.isAssignableFrom(elementType.toClass());
}
@Override
@@ -101,7 +101,7 @@ public abstract class KotlinSerializationStringEncoder<T extends StringFormat> e
@Override
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
return canSerialize(elementType, mimeType);
return canSerialize(elementType, mimeType) && !String.class.isAssignableFrom(elementType.toClass());
}
@Override
@@ -117,7 +117,7 @@ public abstract class KotlinSerializationSupport<T extends SerialFormat> {
if (!this.typePredicate.test(type) || ResolvableType.NONE.equals(type)) {
return false;
}
return serializer(type) != null && supports(mimeType);
return serializer(type) != null && supports(mimeType) && !ServerSentEvent.class.isAssignableFrom(type.toClass());
}
private boolean supports(@Nullable MimeType mimeType) {
@@ -80,7 +80,7 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests<KotlinSerializa
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), MediaType.APPLICATION_JSON)).isTrue()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), jsonSubtype)).isTrue()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), null)).isTrue()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(String::class.java), null)).isTrue()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(String::class.java), null)).isFalse()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), MediaType.APPLICATION_XML)).isFalse()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java),
MediaType("application", "json", StandardCharsets.UTF_8))).isTrue()
@@ -91,7 +91,7 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa
assertThat(encoderForAllTypes.canEncode(pojoType, MediaType.APPLICATION_NDJSON)).isTrue()
assertThat(encoderForAllTypes.canEncode(ResolvableType.forClass(String::class.java), null)).isTrue()
assertThat(encoderForAllTypes.canEncode(ResolvableType.forClass(String::class.java), null)).isFalse()
assertThat(encoderForAllTypes.canEncode(ResolvableType.forClass(Pojo::class.java), MediaType.APPLICATION_XML)).isFalse()
val sseType = ResolvableType.forClass(ServerSentEvent::class.java)
assertThat(encoderForAllTypes.canEncode(sseType, MediaType.APPLICATION_JSON)).isFalse()