11
11
12
12
import com .fasterxml .jackson .databind .*;
13
13
import com .fasterxml .jackson .databind .deser .impl .ObjectIdReader ;
14
+ import com .fasterxml .jackson .databind .deser .impl .PropertyBasedObjectIdGenerator ;
14
15
import com .fasterxml .jackson .databind .deser .impl .ReadableObjectId ;
15
16
import com .fasterxml .jackson .databind .introspect .AnnotatedMember ;
16
17
import com .fasterxml .jackson .databind .introspect .ObjectIdInfo ;
@@ -35,6 +36,8 @@ public class AbstractDeserializer
35
36
36
37
protected final Map <String , SettableBeanProperty > _backRefProperties ;
37
38
39
+ protected transient Map <String ,SettableBeanProperty > _properties ;
40
+
38
41
// support for "native" types, which require special care:
39
42
40
43
protected final boolean _acceptString ;
@@ -48,19 +51,34 @@ public class AbstractDeserializer
48
51
/**********************************************************
49
52
*/
50
53
54
+ /**
55
+ * @since 2.9
56
+ *
57
+ * @param props Regular properties: currently only needed to support property-annotated
58
+ * Object Id handling with property inclusion (needed for determining type of Object Id
59
+ * to bind)
60
+ */
51
61
public AbstractDeserializer (BeanDeserializerBuilder builder ,
52
- BeanDescription beanDesc , Map <String , SettableBeanProperty > backRefProps )
62
+ BeanDescription beanDesc , Map <String , SettableBeanProperty > backRefProps ,
63
+ Map <String , SettableBeanProperty > props )
53
64
{
54
65
_baseType = beanDesc .getType ();
55
66
_objectIdReader = builder .getObjectIdReader ();
56
67
_backRefProperties = backRefProps ;
68
+ _properties = props ;
57
69
Class <?> cls = _baseType .getRawClass ();
58
70
_acceptString = cls .isAssignableFrom (String .class );
59
71
_acceptBoolean = (cls == Boolean .TYPE ) || cls .isAssignableFrom (Boolean .class );
60
72
_acceptInt = (cls == Integer .TYPE ) || cls .isAssignableFrom (Integer .class );
61
73
_acceptDouble = (cls == Double .TYPE ) || cls .isAssignableFrom (Double .class );
62
74
}
63
75
76
+ @ Deprecated // since 2.9
77
+ public AbstractDeserializer (BeanDeserializerBuilder builder ,
78
+ BeanDescription beanDesc , Map <String , SettableBeanProperty > backRefProps ) {
79
+ this (builder , beanDesc , backRefProps , null );
80
+ }
81
+
64
82
protected AbstractDeserializer (BeanDescription beanDesc )
65
83
{
66
84
_baseType = beanDesc .getType ();
@@ -77,7 +95,7 @@ protected AbstractDeserializer(BeanDescription beanDesc)
77
95
* @since 2.9
78
96
*/
79
97
protected AbstractDeserializer (AbstractDeserializer base ,
80
- ObjectIdReader objectIdReader )
98
+ ObjectIdReader objectIdReader , Map < String , SettableBeanProperty > props )
81
99
{
82
100
_baseType = base ._baseType ;
83
101
_backRefProperties = base ._backRefProperties ;
@@ -87,8 +105,9 @@ protected AbstractDeserializer(AbstractDeserializer base,
87
105
_acceptDouble = base ._acceptDouble ;
88
106
89
107
_objectIdReader = objectIdReader ;
108
+ _properties = props ;
90
109
}
91
-
110
+
92
111
/**
93
112
* Factory method used when constructing instances for non-POJO types, like
94
113
* {@link java.util.Map}s.
@@ -109,30 +128,49 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
109
128
if (accessor != null ) {
110
129
ObjectIdInfo objectIdInfo = intr .findObjectIdInfo (accessor );
111
130
if (objectIdInfo != null ) { // some code duplication here as well (from BeanDeserializerFactory)
131
+ JavaType idType ;
132
+ ObjectIdGenerator <?> idGen ;
133
+ SettableBeanProperty idProp = null ;
134
+ ObjectIdResolver resolver = ctxt .objectIdResolverInstance (accessor , objectIdInfo );
135
+
112
136
// 2.1: allow modifications by "id ref" annotations as well:
113
137
objectIdInfo = intr .findObjectReferenceInfo (accessor , objectIdInfo );
114
138
Class <?> implClass = objectIdInfo .getGeneratorType ();
115
- // 02-May-2017, tatu: Alas, properties are NOT available for abstract classes; can not
116
- // support this particular type. Yet.
139
+
117
140
if (implClass == ObjectIdGenerators .PropertyGenerator .class ) {
118
- ctxt .reportBadDefinition (_baseType , String .format (
141
+ PropertyName propName = objectIdInfo .getPropertyName ();
142
+ idProp = (_properties == null ) ? null : _properties .get (propName .getSimpleName ());
143
+ if (idProp == null ) {
144
+ ctxt .reportBadDefinition (_baseType , String .format (
145
+ "Invalid Object Id definition for %s: can not find property with name '%s'" ,
146
+ handledType ().getName (), propName ));
147
+ }
148
+ idType = idProp .getType ();
149
+ idGen = new PropertyBasedObjectIdGenerator (objectIdInfo .getScope ());
150
+ /*
151
+ ctxt.reportBadDefinition(_baseType, String.format(
152
+ /
119
153
"Invalid Object Id definition for abstract type %s: can not use `PropertyGenerator` on polymorphic types using property annotation",
120
154
handledType().getName()));
155
+ */
156
+ } else { // other types simpler
157
+ resolver = ctxt .objectIdResolverInstance (accessor , objectIdInfo );
158
+ JavaType type = ctxt .constructType (implClass );
159
+ idType = ctxt .getTypeFactory ().findTypeParameters (type , ObjectIdGenerator .class )[0 ];
160
+ idGen = ctxt .objectIdGeneratorInstance (accessor , objectIdInfo );
121
161
}
122
- ObjectIdResolver resolver = ctxt .objectIdResolverInstance (accessor , objectIdInfo );
123
- JavaType type = ctxt .constructType (implClass );
124
- JavaType idType = ctxt .getTypeFactory ().findTypeParameters (type , ObjectIdGenerator .class )[0 ];
125
- SettableBeanProperty idProp = null ;
126
- ObjectIdGenerator <?> idGen = ctxt .objectIdGeneratorInstance (accessor , objectIdInfo );
127
162
JsonDeserializer <?> deser = ctxt .findRootValueDeserializer (idType );
128
163
ObjectIdReader oir = ObjectIdReader .construct (idType , objectIdInfo .getPropertyName (),
129
164
idGen , deser , idProp , resolver );
130
- return new AbstractDeserializer (this , oir );
165
+ return new AbstractDeserializer (this , oir , null );
131
166
}
132
167
}
133
168
}
134
- // either way, need to resolve serializer:
135
- return this ;
169
+ if (_properties == null ) {
170
+ return this ;
171
+ }
172
+ // Need to ensure properties are dropped at this point, regardless
173
+ return new AbstractDeserializer (this , _objectIdReader , null );
136
174
}
137
175
138
176
/*
0 commit comments