Browse Source

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
pull/35899/head
Sébastien Deleuze 3 weeks ago
parent
commit
4ee0a8ee33
  1. 2
      spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationStringDecoder.java
  2. 2
      spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationStringEncoder.java
  3. 2
      spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationSupport.java
  4. 2
      spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt
  5. 2
      spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonEncoderTests.kt

2
spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationStringDecoder.java

@ -102,7 +102,7 @@ public abstract class KotlinSerializationStringDecoder<T extends StringFormat> e
@Override @Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
return canSerialize(elementType, mimeType); return canSerialize(elementType, mimeType) && !CharSequence.class.isAssignableFrom(elementType.toClass());
} }
@Override @Override

2
spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationStringEncoder.java

@ -101,7 +101,7 @@ public abstract class KotlinSerializationStringEncoder<T extends StringFormat> e
@Override @Override
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) { public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
return canSerialize(elementType, mimeType); return canSerialize(elementType, mimeType) && !String.class.isAssignableFrom(elementType.toClass());
} }
@Override @Override

2
spring-web/src/main/java/org/springframework/http/codec/KotlinSerializationSupport.java

@ -117,7 +117,7 @@ public abstract class KotlinSerializationSupport<T extends SerialFormat> {
if (!this.typePredicate.test(type) || ResolvableType.NONE.equals(type)) { if (!this.typePredicate.test(type) || ResolvableType.NONE.equals(type)) {
return false; 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) { private boolean supports(@Nullable MimeType mimeType) {

2
spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt

@ -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), MediaType.APPLICATION_JSON)).isTrue()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), jsonSubtype)).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(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_XML)).isFalse()
assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java), assertThat(decoderForAllTypes.canDecode(ResolvableType.forClass(Pojo::class.java),
MediaType("application", "json", StandardCharsets.UTF_8))).isTrue() MediaType("application", "json", StandardCharsets.UTF_8))).isTrue()

2
spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonEncoderTests.kt

@ -91,7 +91,7 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa
assertThat(encoderForAllTypes.canEncode(pojoType, MediaType.APPLICATION_NDJSON)).isTrue() 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() assertThat(encoderForAllTypes.canEncode(ResolvableType.forClass(Pojo::class.java), MediaType.APPLICATION_XML)).isFalse()
val sseType = ResolvableType.forClass(ServerSentEvent::class.java) val sseType = ResolvableType.forClass(ServerSentEvent::class.java)
assertThat(encoderForAllTypes.canEncode(sseType, MediaType.APPLICATION_JSON)).isFalse() assertThat(encoderForAllTypes.canEncode(sseType, MediaType.APPLICATION_JSON)).isFalse()

Loading…
Cancel
Save