Skip to content

Commit dfa1b44

Browse files
committed
Fix #299
1 parent 57a51dc commit dfa1b44

16 files changed

+65
-30
lines changed

release-notes/VERSION

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Project: jackson-databind
1010
#113: Problem deserializing polymorphic types with @JsonCreator
1111
#165: Add `DeserializationContext.getContextualType()` to let deserializer
1212
known the expected type.
13+
#299: Add `DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS` to allow missing
14+
Object Ids (as global default)
1315
#408: External type id does not allow use of 'visible=true'
1416
#421: @JsonCreator not used in case of multiple creators with parameter names
1517
(reported by Lovro P, lpandzic@github)

src/main/java/com/fasterxml/jackson/databind/DeserializationFeature.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,22 @@ public enum DeserializationFeature implements ConfigFeature
172172
*/
173173
FAIL_ON_IGNORED_PROPERTIES(false),
174174

175+
/**
176+
* Feature that determines what happens if an Object Id reference is encountered
177+
* that does not refer to an actual Object with that id ("unresolved Object Id"):
178+
* either an exception is thrown (<code>true</code>), or a null object is used
179+
* instead (<code>false</code>).
180+
* Note that if this is set to <code>false</code>, no further processing is done;
181+
* specifically, if reference is defined via setter method, that method will NOT
182+
* be called.
183+
*<p>
184+
* Feature is enabled by default, so that unknown Object Ids will result in an
185+
* exception being thrown, at the end of deserialization.
186+
*
187+
* @since 2.5
188+
*/
189+
FAIL_ON_UNRESOLVED_OBJECT_IDS(true),
190+
175191
/**
176192
* Feature that determines whether Jackson code should catch
177193
* and wrap {@link Exception}s (but never {@link Error}s!)
@@ -188,7 +204,7 @@ public enum DeserializationFeature implements ConfigFeature
188204
* Feature is enabled by default.
189205
*/
190206
WRAP_EXCEPTIONS(true),
191-
207+
192208
/*
193209
/******************************************************
194210
/* Structural conversion features

src/main/java/com/fasterxml/jackson/databind/deser/DefaultDeserializationContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,18 @@ public void checkUnresolvedObjectId() throws UnresolvedForwardReference
138138
if (_objectIds == null) {
139139
return;
140140
}
141-
141+
// 29-Dec-2014, tatu: As per [databind#299], may also just let unresolved refs be...
142+
if (!isEnabled(DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS)) {
143+
return;
144+
}
142145
UnresolvedForwardReference exception = null;
143146
for (Entry<IdKey,ReadableObjectId> entry : _objectIds.entrySet()) {
144147
ReadableObjectId roid = entry.getValue();
145148
if (roid.hasReferringProperties()) {
146149
if (exception == null) {
147150
exception = new UnresolvedForwardReference("Unresolved forward references for: ");
148151
}
149-
for (Iterator<Referring> iterator = roid.referringProperties(); iterator.hasNext();) {
152+
for (Iterator<Referring> iterator = roid.referringProperties(); iterator.hasNext(); ) {
150153
Referring referring = iterator.next();
151154
exception.addUnresolvedId(roid.getKey().key, referring.getBeanType(), referring.getLocation());
152155
}

src/main/java/com/fasterxml/jackson/databind/ser/ContainerSerializer.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,25 @@ public ContainerSerializer<?> withValueTypeSerializer(TypeSerializer vts) {
8484
* {@link com.fasterxml.jackson.databind.SerializerProvider#findValueSerializer}.
8585
*/
8686
public abstract JsonSerializer<?> getContentSerializer();
87-
87+
8888
/*
8989
/**********************************************************
9090
/* Abstract methods for sub-classes to implement
9191
/**********************************************************
9292
*/
93-
93+
9494
/* Overridden as abstract, to force re-implementation; necessary for all
9595
* collection types.
9696
*/
9797
@Override
98-
public abstract boolean isEmpty(T value);
98+
@Deprecated
99+
public boolean isEmpty(T value) {
100+
return isEmpty(null, value);
101+
}
102+
103+
// since 2.5: should be declared abstract in future (2.6)
104+
// @Override
105+
// public abstract boolean isEmpty(SerializerProvider prov, T value);
99106

100107
/**
101108
* Method called to determine if the given value (of type handled by

src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedListSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public IndexedListSerializer withResolved(BeanProperty property,
4747
*/
4848

4949
@Override
50-
public boolean isEmpty(List<?> value) {
50+
public boolean isEmpty(SerializerProvider prov, List<?> value) {
5151
return (value == null) || value.isEmpty();
5252
}
5353

src/main/java/com/fasterxml/jackson/databind/ser/impl/IteratorSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public IteratorSerializer(IteratorSerializer src,
2828
}
2929

3030
@Override
31-
public boolean isEmpty(Iterator<?> value) {
31+
public boolean isEmpty(SerializerProvider prov, Iterator<?> value) {
3232
return (value == null) || !value.hasNext();
3333
}
3434

src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public boolean hasSingleElement(Map.Entry<?,?> value) {
174174
}
175175

176176
@Override
177-
public boolean isEmpty(Entry<?, ?> value) {
177+
public boolean isEmpty(SerializerProvider prov, Entry<?, ?> value) {
178178
return (value == null);
179179
}
180180

src/main/java/com/fasterxml/jackson/databind/ser/impl/StringArraySerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public JsonSerializer<?> getContentSerializer() {
130130
}
131131

132132
@Override
133-
public boolean isEmpty(String[] value) {
133+
public boolean isEmpty(SerializerProvider prov, String[] value) {
134134
return (value == null) || (value.length == 0);
135135
}
136136

src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public CollectionSerializer withResolved(BeanProperty property,
6262
*/
6363

6464
@Override
65-
public boolean isEmpty(Collection<?> value) {
65+
public boolean isEmpty(SerializerProvider prov, Collection<?> value) {
6666
return (value == null) || value.isEmpty();
6767
}
6868

src/main/java/com/fasterxml/jackson/databind/ser/std/EnumMapSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public JsonSerializer<?> getContentSerializer() {
162162
}
163163

164164
@Override
165-
public boolean isEmpty(EnumMap<? extends Enum<?>,?> value) {
165+
public boolean isEmpty(SerializerProvider prov, EnumMap<? extends Enum<?>,?> value) {
166166
return (value == null) || value.isEmpty();
167167
}
168168

0 commit comments

Comments
 (0)