Browse Source

Fix a regression in Kotlin serialization support

After gh-29068, some Type instances can throw an
IllegalArgumentException. This commit catches them
properly to just return a null serializer in that
case.

Closes gh-29192
pull/29208/head
Sébastien Deleuze 3 years ago
parent
commit
42ab1b75e7
  1. 6
      spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java
  2. 6
      spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java
  3. 6
      spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java
  4. 1
      spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt
  5. 1
      spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonEncoderTests.kt
  6. 5
      spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt

6
spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java

@ -133,7 +133,11 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder<Object> { @@ -133,7 +133,11 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder<Object> {
private KSerializer<Object> serializer(Type type) {
KSerializer<Object> serializer = serializerCache.get(type);
if (serializer == null) {
serializer = SerializersKt.serializerOrNull(type);
try {
serializer = SerializersKt.serializerOrNull(type);
}
catch (IllegalArgumentException ignored) {
}
if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) {
return null;
}

6
spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java

@ -121,7 +121,11 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder<Object> { @@ -121,7 +121,11 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder<Object> {
private KSerializer<Object> serializer(Type type) {
KSerializer<Object> serializer = serializerCache.get(type);
if (serializer == null) {
serializer = SerializersKt.serializerOrNull(type);
try {
serializer = SerializersKt.serializerOrNull(type);
}
catch (IllegalArgumentException ignored) {
}
if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) {
return null;
}

6
spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java

@ -173,7 +173,11 @@ public class KotlinSerializationJsonHttpMessageConverter extends AbstractGeneric @@ -173,7 +173,11 @@ public class KotlinSerializationJsonHttpMessageConverter extends AbstractGeneric
private KSerializer<Object> serializer(Type type) {
KSerializer<Object> serializer = serializerCache.get(type);
if (serializer == null) {
serializer = SerializersKt.serializerOrNull(type);
try {
serializer = SerializersKt.serializerOrNull(type);
}
catch (IllegalArgumentException ignored) {
}
if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) {
return null;
}

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

@ -61,6 +61,7 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests<KotlinSerializa @@ -61,6 +61,7 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests<KotlinSerializa
Assertions.assertThat(decoder.canDecode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_JSON)).isTrue()
Assertions.assertThat(decoder.canDecode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_PDF)).isFalse()
Assertions.assertThat(decoder.canDecode(ResolvableType.forClass(Ordered::class.java), MediaType.APPLICATION_JSON)).isFalse()
Assertions.assertThat(decoder.canDecode(ResolvableType.NONE, MediaType.APPLICATION_JSON)).isFalse()
}
@Test

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

@ -56,6 +56,7 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa @@ -56,6 +56,7 @@ class KotlinSerializationJsonEncoderTests : AbstractEncoderTests<KotlinSerializa
Assertions.assertThat(encoder.canEncode(ResolvableType.forClassWithGenerics(List::class.java, Pojo::class.java), MediaType.APPLICATION_JSON)).isTrue()
Assertions.assertThat(encoder.canEncode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_JSON)).isTrue()
Assertions.assertThat(encoder.canEncode(ResolvableType.forClassWithGenerics(ArrayList::class.java, Int::class.java), MediaType.APPLICATION_PDF)).isFalse()
Assertions.assertThat(encoder.canEncode(ResolvableType.NONE, MediaType.APPLICATION_JSON)).isFalse()
}
@Test

5
spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt

@ -21,6 +21,7 @@ import org.assertj.core.api.Assertions.assertThat @@ -21,6 +21,7 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatExceptionOfType
import org.junit.jupiter.api.Test
import org.springframework.core.Ordered
import org.springframework.core.ResolvableType
import org.springframework.http.MediaType
import org.springframework.http.MockHttpInputMessage
import org.springframework.http.MockHttpOutputMessage
@ -62,6 +63,8 @@ class KotlinSerializationJsonHttpMessageConverterTests { @@ -62,6 +63,8 @@ class KotlinSerializationJsonHttpMessageConverterTests {
assertThat(converter.canRead(typeTokenOf<Ordered>(), Ordered::class.java, MediaType.APPLICATION_JSON)).isFalse()
assertThat(converter.canRead(typeTokenOf<List<Ordered>>(), List::class.java, MediaType.APPLICATION_JSON)).isFalse()
assertThat(converter.canRead(ResolvableType.NONE.type, null, MediaType.APPLICATION_JSON)).isFalse()
}
@Test
@ -83,6 +86,8 @@ class KotlinSerializationJsonHttpMessageConverterTests { @@ -83,6 +86,8 @@ class KotlinSerializationJsonHttpMessageConverterTests {
assertThat(converter.canWrite(typeTokenOf<List<Int>>(), List::class.java, MediaType.APPLICATION_PDF)).isFalse()
assertThat(converter.canWrite(typeTokenOf<Ordered>(), Ordered::class.java, MediaType.APPLICATION_JSON)).isFalse()
assertThat(converter.canWrite(ResolvableType.NONE.type, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isFalse()
}
@Test

Loading…
Cancel
Save