我甯願建議使用
constructor creators保持模型對象不可變.也就是說,所有JSON值都傳遞給構造函數,該構造函數将初始化其他計算屬性.
無論如何,如果你想在反序列化後自定義一個對象(不為每個類型編寫一個反序列化器),你可以通過最終調用新構造執行個體的特殊方法的方式來實作modify the deserializer.這是一個适用于實作特殊接口的所有類的示例(可以考慮使用注釋來标記post構造方法).
public class JacksonPostConstruct {
public static interface PostConstructor {
void postConstruct();
}
public static class Bean implements PostConstructor {
private final String field;
@JsonCreator
public Bean(@JsonProperty("field") String field) {
this.field = field;
}
public void postConstruct() {
System.out.println("Post construct: " + toString());
}
@Override
public String toString() {
return "Bean{" +
"field='" + field + '\'' +
'}';
}
}
private static class PostConstructDeserializer extends DelegatingDeserializer {
private final JsonDeserializer> deserializer;
public PostConstructDeserializer(JsonDeserializer> deserializer) {
super(deserializer);
this.deserializer = deserializer;
}
@Override
protected JsonDeserializer> newDelegatingInstance(JsonDeserializer> newDelegatee) {
return deserializer;
}
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
Object result = _delegatee.deserialize(jp, ctxt);
if (result instanceof PostConstructor) {
((PostConstructor) result).postConstruct();
}
return result;
}
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc,
final JsonDeserializer> deserializer) {
return new PostConstructDeserializer(deserializer);
}
});
mapper.registerModule(module);
String json = "{\"field\":\"value\"}";
System.out.println(mapper.readValue(json, Bean.class));
}
}
輸出:
Post construct: Bean{field='value'}
Bean{field='value'}