Skip to content

Commit 57d8d92

Browse files
committed
Minor clean up
1 parent 4349557 commit 57d8d92

File tree

4 files changed

+26
-23
lines changed

4 files changed

+26
-23
lines changed

release-notes/VERSION

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Versions: 3.x (for earlier see VERSION-2.x)
1111
#1196: Add opt-in error collection for deserialization
1212
(requested by @odrotbohm)
1313
(contributed by @sri-adarsh-kumar)
14+
#1654: @JsonDeserialize(contentUsing=...) is ignored if content
15+
type is determined by @JsonTypeInfo
16+
(reported by @pdegoeje)
1417
#1980: Add method `remove(JsonPointer)` in `ContainerNode`
1518
(fix by @cowtowncoder, w/ Claude code)
1619
#3964: Deserialization issue: MismatchedInputException, Bean not

src/main/java/tools/jackson/databind/jsontype/TypeResolverProvider.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import tools.jackson.databind.introspect.Annotated;
1010
import tools.jackson.databind.introspect.AnnotatedClass;
1111
import tools.jackson.databind.introspect.AnnotatedMember;
12+
import tools.jackson.databind.jsontype.impl.NoOpTypeDeserializer;
13+
import tools.jackson.databind.jsontype.impl.NoOpTypeSerializer;
1214
import tools.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
1315

1416
/**
@@ -172,7 +174,7 @@ public TypeSerializer findPropertyContentTypeSerializer(SerializationContext ctx
172174
}
173175
// [databind#1654]: Explicit `@JsonTypeInfo(Id.NONE)` should block class-level type info
174176
if (b == NO_RESOLVER) {
175-
return tools.jackson.databind.jsontype.impl.NoOpTypeSerializer.instance();
177+
return NoOpTypeSerializer.instance();
176178
}
177179
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(
178180
config, accessor, contentType);
@@ -195,7 +197,7 @@ public TypeDeserializer findPropertyContentTypeDeserializer(DeserializationConte
195197
}
196198
// [databind#1654]: Explicit `@JsonTypeInfo(Id.NONE)` should block class-level type info
197199
if (b == NO_RESOLVER) {
198-
return new tools.jackson.databind.jsontype.impl.NoOpTypeDeserializer(contentType);
200+
return new NoOpTypeDeserializer(contentType, null);
199201
}
200202
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByTypeId(config,
201203
accessor, contentType);

src/main/java/tools/jackson/databind/jsontype/impl/NoOpTypeDeserializer.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,15 @@
2222
public class NoOpTypeDeserializer extends TypeDeserializer
2323
{
2424
private final JavaType _baseType;
25-
private final ValueDeserializer<Object> _defaultDeserializer;
25+
private final ValueDeserializer<Object> _deserializer;
2626

27-
public NoOpTypeDeserializer(JavaType baseType) {
27+
public NoOpTypeDeserializer(JavaType baseType, ValueDeserializer<Object> deser) {
2828
_baseType = baseType;
29-
_defaultDeserializer = null;
29+
_deserializer = deser;
3030
}
3131

32-
private NoOpTypeDeserializer(JavaType baseType,
33-
ValueDeserializer<Object> defaultDeserializer) {
34-
_baseType = baseType;
35-
_defaultDeserializer = defaultDeserializer;
36-
}
37-
38-
public NoOpTypeDeserializer withDefaultImpl(ValueDeserializer<Object> deser) {
39-
if (_defaultDeserializer == deser) {
32+
public NoOpTypeDeserializer withDeserializer(ValueDeserializer<Object> deser) {
33+
if (_deserializer == deser) {
4034
return this;
4135
}
4236
return new NoOpTypeDeserializer(_baseType, deser);
@@ -49,7 +43,8 @@ public TypeDeserializer forProperty(BeanProperty prop) {
4943

5044
@Override
5145
public JsonTypeInfo.As getTypeInclusion() {
52-
return JsonTypeInfo.As.PROPERTY;
46+
// No proper value but need to return something
47+
return JsonTypeInfo.As.EXISTING_PROPERTY;
5348
}
5449

5550
@Override
@@ -102,15 +97,16 @@ public Object deserializeTypedFromAny(JsonParser p,
10297
protected Object _deserialize(JsonParser p, DeserializationContext ctxt)
10398
throws JacksonException
10499
{
105-
if (_defaultDeserializer != null) {
106-
return _defaultDeserializer.deserialize(p, ctxt);
107-
}
100+
ValueDeserializer<Object> deser = _deserializer;
101+
108102
// Find deserializer for the base type (this will find custom deserializers
109103
// registered for this type, including those from @JsonDeserialize annotations)
110-
ValueDeserializer<Object> deser = ctxt.findContextualValueDeserializer(_baseType, null);
111104
if (deser == null) {
112-
ctxt.reportBadDefinition(_baseType,
113-
"Cannot find deserializer for type " + _baseType);
105+
deser = ctxt.findContextualValueDeserializer(_baseType, null);
106+
if (deser == null) {
107+
ctxt.reportBadDefinition(_baseType,
108+
"Cannot find deserializer for type " + _baseType);
109+
}
114110
}
115111
return deser.deserialize(p, ctxt);
116112
}

src/main/java/tools/jackson/databind/jsontype/impl/NoOpTypeSerializer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public TypeSerializer forProperty(SerializationContext ctxt, BeanProperty prop)
3838

3939
@Override
4040
public JsonTypeInfo.As getTypeInclusion() {
41-
return JsonTypeInfo.As.PROPERTY;
41+
// No proper one to use but must return something:
42+
return JsonTypeInfo.As.EXISTING_PROPERTY;
4243
}
4344

4445
@Override
@@ -62,7 +63,8 @@ public WritableTypeId writeTypePrefix(JsonGenerator g,
6263
} else if (typeId.valueShape == JsonToken.START_ARRAY) {
6364
g.writeStartArray();
6465
}
65-
// Mark as "already written" to prevent suffix from trying to close
66+
// 1. Start marker (part of value) was written but
67+
// 2. No value wrapper was written.
6668
typeId.wrapperWritten = false;
6769
return typeId;
6870
}
@@ -72,7 +74,7 @@ public WritableTypeId writeTypeSuffix(JsonGenerator g,
7274
SerializationContext ctxt, WritableTypeId typeId)
7375
throws JacksonException
7476
{
75-
// Write the value end token if needed, but NO type information
77+
// Write the value end token if needed, but no wrapper to close
7678
if (typeId.valueShape == JsonToken.START_OBJECT) {
7779
g.writeEndObject();
7880
} else if (typeId.valueShape == JsonToken.START_ARRAY) {

0 commit comments

Comments
 (0)