1
1
package com.fasterxml.jackson.module.kotlin.test
2
2
3
3
import com.fasterxml.jackson.annotation.JsonCreator
4
- import com.fasterxml.jackson.annotation.JsonSubTypes
5
4
import com.fasterxml.jackson.annotation.JsonTypeInfo
6
5
import com.fasterxml.jackson.annotation.JsonValue
6
+ import com.fasterxml.jackson.core.type.TypeReference
7
+ import com.fasterxml.jackson.databind.exc.MismatchedInputException
7
8
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
8
9
import com.fasterxml.jackson.module.kotlin.test.SealedClassTest.SuperClass.B
9
10
import org.junit.Test
@@ -27,6 +28,21 @@ class SealedClassTest {
27
28
assertTrue { result is B }
28
29
}
29
30
31
+ @Test
32
+ fun sealedClassWithoutSubTypesList () {
33
+ val result = mapper.readValue(
34
+ """ [$jsonB , $jsonB ]""" ,
35
+ object : TypeReference <List <SuperClass >>() {}
36
+ )
37
+ assertEquals(2 , result.size)
38
+ }
39
+
40
+ @JsonTypeInfo(use = JsonTypeInfo .Id .NAME )
41
+ sealed class SuperClass {
42
+ class A : SuperClass ()
43
+ class B : SuperClass ()
44
+ }
45
+
30
46
/* *
31
47
* Tests that we can use JsonTypeInfo.Id.DEDUCTION to deduct sealed types without the need for explicit fields.
32
48
*/
@@ -36,24 +52,27 @@ class SealedClassTest {
36
52
val single = mapper.readValue(serializedSingle, SealedRequest ::class .java)
37
53
assertTrue(single is SealedRequest .SingleRequest )
38
54
assertEquals(" single" , single.request)
39
-
40
- val serializedBatch = """ [{"request":"first"},{"request":"second"}]"""
41
- val batch = mapper.readValue(serializedBatch, SealedRequest ::class .java)
42
- assertTrue(batch is SealedRequest .BatchRequest )
43
- assertEquals(2 , batch.requests.size)
44
- assertEquals(" first" , batch.requests[0 ].request)
45
- assertEquals(" second" , batch.requests[1 ].request)
46
55
}
47
56
48
- @JsonTypeInfo(use = JsonTypeInfo .Id .NAME )
49
- sealed class SuperClass {
50
- class A : SuperClass ()
51
- class B : SuperClass ()
57
+ /* *
58
+ * Attempting to deserialize a collection by deduction
59
+ */
60
+ @Test
61
+ fun sealedClassWithoutTypeDiscriminatorList () {
62
+ val serializedBatch = """ [{"request":"first"},{"request":"second"}]"""
63
+ expectFailure<MismatchedInputException >(" Deserializing a list using deduction is fixed!" ) {
64
+ val batch = mapper.readValue(serializedBatch, SealedRequest ::class .java)
65
+ assertTrue(batch is SealedRequest .BatchRequest )
66
+ assertEquals(2 , batch.requests.size)
67
+ assertEquals(" first" , batch.requests[0 ].request)
68
+ assertEquals(" second" , batch.requests[1 ].request)
69
+ }
52
70
}
53
71
54
72
@JsonTypeInfo(use = JsonTypeInfo .Id .DEDUCTION )
55
73
sealed class SealedRequest {
56
74
data class SingleRequest (val request : String ) : SealedRequest()
57
- data class BatchRequest @JsonCreator constructor(@get:JsonValue val requests : List <SingleRequest >): SealedRequest()
75
+ data class BatchRequest @JsonCreator constructor(@get:JsonValue val requests : List <SingleRequest >) :
76
+ SealedRequest ()
58
77
}
59
78
}
0 commit comments