1 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
在這個(gè)答案的幫助下,我找到了解決方案:自定義反序列化器需要基于默認(rèn)反序列化器,它正確實(shí)現(xiàn)了反向引用機(jī)制。
這比僅僅從正確的基類繼承要復(fù)雜一些。相反,您需要通過(guò)自定義獲?。ㄍ耆渲玫模┠J(rèn)反序列化器實(shí)例BeanDeserializerModifier
,然后將此實(shí)例傳遞給您的子類DelegatingDeserializer
:
public ObjectMapper getMapperWithCustomDeserializer() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc, JsonDeserializer<?> defaultDeserializer) {
if (beanDesc.getBeanClass() == User.class) {
return new UserDeserializer(defaultDeserializer);
} else {
return defaultDeserializer;
}
}
});
objectMapper.registerModule(module);
return objectMapper;
}
然后自定義反序列化器需要如下所示:
public class UserDeserializer extends DelegatingDeserializer {
public UserDeserializer(JsonDeserializer<?> delegate) {
super(delegate);
}
@Override
protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegate) {
return new UserDeserializer(newDelegate);
}
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String key = p.getCurrentName();
User result = (User) super.deserialize(p, ctxt);
result.userId = key;
return result;
}
}
最后,您需要?jiǎng)h除@JsonDeserialize注釋。然后,自定義反序列化器和@JsonBackReference應(yīng)該工作。
添加回答
舉報(bào)