Skip to content

Commit d96e2cc

Browse files
committed
further work on AtomicReference deser
1 parent 3c6b59b commit d96e2cc

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,8 @@ public JsonDeserializer<?> createReferenceDeserializer(DeserializationContext ct
13021302
if (deser == null) {
13031303
// Just one referential type as of JDK 1.7 / Java 7: AtomicReference (Java 8 adds Optional)
13041304
if (AtomicReference.class.isAssignableFrom(type.getRawClass())) {
1305+
// 19-Apr-2016, tatu: By default we'd get something that expect to see an
1306+
// AtomicReference... but what we need is something else, so...
13051307
return new AtomicReferenceDeserializer(contentType, contentTypeDeser, contentDeser);
13061308
}
13071309
}

src/main/java/com/fasterxml/jackson/databind/deser/std/AtomicReferenceDeserializer.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class AtomicReferenceDeserializer
2222
protected final TypeDeserializer _valueTypeDeserializer;
2323

2424
protected final JsonDeserializer<?> _valueDeserializer;
25-
25+
2626
/**
2727
* @param referencedType Parameterization of this reference
2828
*/
@@ -84,7 +84,7 @@ public AtomicReference<?> deserialize(JsonParser p, DeserializationContext ctxt)
8484

8585
@Override
8686
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
87-
TypeDeserializer typeDeserializer) throws IOException
87+
TypeDeserializer typeDeser) throws IOException
8888
{
8989
final JsonToken t = p.getCurrentToken();
9090
if (t == JsonToken.VALUE_NULL) { // can this actually happen?
@@ -96,7 +96,13 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
9696
if ((t != null) && t.isScalarValue()) {
9797
return deserialize(p, ctxt);
9898
}
99-
// andn this is what should really happen
100-
return typeDeserializer.deserializeTypedFromAny(p, ctxt);
99+
// 19-Apr-2016, tatu: Alas, due to there not really being anything for AtomicReference
100+
// itself, need to just ignore `typeDeser`, use TypeDeserializer we do have for contents
101+
// and it might just work.
102+
103+
if (_valueTypeDeserializer == null) {
104+
return deserialize(p, ctxt);
105+
}
106+
return new AtomicReference<Object>(_valueTypeDeserializer.deserializeTypedFromAny(p, ctxt));
101107
}
102108
}

src/test/java/com/fasterxml/jackson/failing/PolymorphicViaRefTypeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public AtomicStringWrapper(String str) {
1515
wrapper = new AtomicReference<StringWrapper>(new StringWrapper(str));
1616
}
1717
}
18-
18+
1919
/*
2020
/**********************************************************************
2121
/* Test methods

0 commit comments

Comments
 (0)