1
1
package com .fasterxml .jackson .databind .deser ;
2
2
3
+ import java .util .ArrayList ;
3
4
import java .util .Iterator ;
4
5
import java .util .LinkedHashMap ;
6
+ import java .util .List ;
5
7
import java .util .Map .Entry ;
6
8
7
9
import com .fasterxml .jackson .annotation .ObjectIdGenerator ;
10
+ import com .fasterxml .jackson .annotation .ObjectIdResolver ;
8
11
import com .fasterxml .jackson .annotation .ObjectIdGenerator .IdKey ;
12
+ import com .fasterxml .jackson .annotation .SimpleObjectIdResolver ;
9
13
import com .fasterxml .jackson .core .JsonParser ;
10
14
import com .fasterxml .jackson .databind .*;
11
15
import com .fasterxml .jackson .databind .annotation .NoClass ;
@@ -32,6 +36,8 @@ public abstract class DefaultDeserializationContext
32
36
33
37
protected transient LinkedHashMap <ObjectIdGenerator .IdKey , ReadableObjectId > _objectIds ;
34
38
39
+ private List <ObjectIdResolver > _objectIdResolvers ;
40
+
35
41
/**
36
42
* Constructor that will pass specified deserializer factory and
37
43
* cache: cache may be null (in which case default implementation
@@ -58,44 +64,70 @@ protected DefaultDeserializationContext(DefaultDeserializationContext src,
58
64
*/
59
65
60
66
@ Override
61
- public ReadableObjectId findObjectId (Object id ,
62
- ObjectIdGenerator <?> generator )
67
+ public ReadableObjectId findObjectId (Object id , ObjectIdGenerator <?> generator , ObjectIdResolver resolverType )
63
68
{
64
69
final ObjectIdGenerator .IdKey key = generator .key (id );
65
70
if (_objectIds == null ) {
66
- _objectIds = new LinkedHashMap <ObjectIdGenerator .IdKey , ReadableObjectId >();
71
+ _objectIds = new LinkedHashMap <ObjectIdGenerator .IdKey ,ReadableObjectId >();
67
72
} else {
68
73
ReadableObjectId entry = _objectIds .get (key );
69
74
if (entry != null ) {
70
75
return entry ;
71
76
}
72
77
}
73
- ReadableObjectId entry = new ReadableObjectId (id );
78
+
79
+ // Not seen yet, must create entry and configure resolver.
80
+ ObjectIdResolver resolver = null ;
81
+
82
+ if (_objectIdResolvers == null ) {
83
+ _objectIdResolvers = new ArrayList <ObjectIdResolver >(8 );
84
+ } else {
85
+ for (ObjectIdResolver res : _objectIdResolvers ) {
86
+ if (res .canUseFor (resolverType )) {
87
+ resolver = res ;
88
+ break ;
89
+ }
90
+ }
91
+ }
92
+ if (resolver == null ) {
93
+ resolver = resolverType .newForDeserialization (this );
94
+ _objectIdResolvers .add (resolver );
95
+ }
96
+
97
+ ReadableObjectId entry = new ReadableObjectId (key );
98
+ entry .setResolver (resolver );
74
99
_objectIds .put (key , entry );
75
100
return entry ;
76
101
}
77
102
78
103
@ Override
79
- public void checkUnresolvedObjectId () throws UnresolvedForwardReference
104
+ public ReadableObjectId findObjectId ( Object id , ObjectIdGenerator <?> generator )
80
105
{
81
- if (_objectIds == null ){
106
+ return findObjectId (id , generator , new SimpleObjectIdResolver ());
107
+ }
108
+
109
+ @ Override
110
+ public void checkUnresolvedObjectId ()
111
+ throws UnresolvedForwardReference
112
+ {
113
+ if (_objectIds == null ) {
82
114
return ;
83
115
}
84
116
85
117
UnresolvedForwardReference exception = null ;
86
118
for (Entry <IdKey ,ReadableObjectId > entry : _objectIds .entrySet ()) {
87
119
ReadableObjectId roid = entry .getValue ();
88
- if (roid .hasReferringProperties ()){
89
- if (exception == null ){
120
+ if (roid .hasReferringProperties ()) {
121
+ if (exception == null ) {
90
122
exception = new UnresolvedForwardReference ("Unresolved forward references for: " );
91
123
}
92
124
for (Iterator <Referring > iterator = roid .referringProperties (); iterator .hasNext ();) {
93
125
Referring referring = iterator .next ();
94
- exception .addUnresolvedId (roid .id , referring .getBeanType (), referring .getLocation ());
126
+ exception .addUnresolvedId (roid .getKey (). key , referring .getBeanType (), referring .getLocation ());
95
127
}
96
128
}
97
129
}
98
- if (exception != null ){
130
+ if (exception != null ) {
99
131
throw exception ;
100
132
}
101
133
}
0 commit comments