Reputation: 420951
When deserializing MyEntity
(which is an interface) I either have
the following input:
{ "id": 123 }
in which case I would like to deserialize it into a
new MyEntityRef(123)
or I have the following input:
{
"id": 123,
"message": "Hello world",
"otherEntity": {
"field": "value",
...
}
}
in which case I would like to deserialize it as
new MyEntityImpl(123, "Hello world", otherEntity);
where otherEntity
is deserialized the same way as if it was found outside the context of MyEntity
.
I've figured out how to register my own custom deserializer through a SimpleModule
but I don't know how to
message
above).otherEntity
above).Upvotes: 2
Views: 1845
Reputation: 420951
Finally solved it by configuring my ObjectMapper as follows:
ObjectMapper mapper = new ObjectMapper();
SimpleModule idAsRefModule = new SimpleModule("ID-to-ref",
new Version(1, 0, 0, null));
idAsRefModule.addDeserializer(TestEntity.class,
new JsonDeserializer<TestEntity>() {
@Override
public TestEntity deserialize(JsonParser jp, DeserializationContext dc)
throws IOException, JsonProcessingException {
ObjectCodec codec = jp.getCodec();
JsonNode node = codec.readTree(jp);
boolean isFullImpl = node.has("message");
Class<? extends TestEntity> cls = isFullImpl ? TestEntityImpl.class
: TestEntityRef.class;
return codec.treeToValue(node, cls);
}
});
mapper.registerModule(idAsRefModule);
return mapper;
Upvotes: 1