11package com .fasterxml .jackson .databind .records ;
22
3+ import com .fasterxml .jackson .annotation .JsonCreator ;
4+ import com .fasterxml .jackson .annotation .JsonProperty ;
35import com .fasterxml .jackson .annotation .JsonSubTypes ;
46import com .fasterxml .jackson .annotation .JsonTypeInfo ;
7+
58import com .fasterxml .jackson .databind .ObjectMapper ;
69import com .fasterxml .jackson .databind .testutil .DatabindTestUtil ;
10+
711import org .junit .jupiter .api .Test ;
812
913import static org .junit .jupiter .api .Assertions .assertEquals ;
14+ import static org .junit .jupiter .api .Assertions .assertNotNull ;
1015
1116// [databind#3102]
1217public class RecordTypeInfo3342Test extends DatabindTestUtil
@@ -37,6 +42,36 @@ public record Example(
3742 })
3843 SpiceTolerance tolerance ) { }
3944
45+ // Test from https://github.com/FasterXML/jackson-modules-base/pull/249
46+
47+ static record RootRecord249 (AbstractMember249 member ) {
48+ }
49+
50+ @ JsonTypeInfo (use = JsonTypeInfo .Id .NAME , include = JsonTypeInfo .As .PROPERTY , property = "@class" )
51+ @ JsonSubTypes ({
52+ @ JsonSubTypes .Type (value = StringMember .class , name = "string" ),
53+ @ JsonSubTypes .Type (value = IntMember .class , name = "int" )
54+ })
55+ static abstract class AbstractMember249 { }
56+
57+ static final class StringMember extends AbstractMember249 {
58+ final String val ;
59+
60+ @ JsonCreator
61+ public StringMember (@ JsonProperty ("val" ) String val ) {
62+ this .val = val ;
63+ }
64+ }
65+
66+ static final class IntMember extends AbstractMember249 {
67+ final int val ;
68+
69+ @ JsonCreator
70+ public IntMember (@ JsonProperty ("val" ) int val ) {
71+ this .val = val ;
72+ }
73+ }
74+
4075 private final ObjectMapper MAPPER = newJsonMapper ();
4176
4277 @ Test
@@ -60,4 +95,15 @@ public void testSerializeDeserializeJsonSubType_HIGH() throws Exception {
6095 Example value = MAPPER .readValue (json , Example .class );
6196 assertEquals (record , value );
6297 }
98+
99+ // Test from https://github.com/FasterXML/jackson-modules-base/pull/249
100+ @ Test
101+ public void testDeserializeRecordWithAbstractMember () throws Exception {
102+ RootRecord249 value = MAPPER .readValue (
103+ "{\" member\" :{\" @class\" :\" string\" ,\" val\" :\" Hello, abstract member!\" }}" ,
104+ RootRecord249 .class );
105+ assertNotNull (value .member ());
106+ assertEquals (StringMember .class , value .member ().getClass ());
107+ assertEquals ("Hello, abstract member!" , ((StringMember )value .member ()).val );
108+ }
63109}
0 commit comments