我有一个使用 Jackson 序列化和反序列化的值对象。
VO 有两个字段:x 和 y。但是只有在设置 x 时调用 setY 才有意义。有什么方法可以确保在反序列化期间 setX 比 setY 更早被调用?
我有一个使用 Jackson 序列化和反序列化的值对象。
VO 有两个字段:x 和 y。但是只有在设置 x 时调用 setY 才有意义。有什么方法可以确保在反序列化期间 setX 比 setY 更早被调用?
您只能通过为您的 POJO (VO) 类实现自定义反序列化器来做到这一点。假设您的 POJO 类如下所示:
class Point {
private int x;
private int y;
//getters, setters, toString
}
现在,您可以实现反序列化器。你可以这样做:
class PointJsonDeserializer extends JsonDeserializer<Point> {
@Override
public Point deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
InnerPoint root = jp.readValueAs(InnerPoint.class);
Point point = new Point();
point.setX(root.x);
point.setY(root.y);
return point;
}
private static class InnerPoint {
public int x;
public int y;
}
}
在那之后,你必须告诉杰克逊使用上面的解串器。例如,以这种方式:
@JsonDeserialize(using = PointJsonDeserializer.class)
class Point {
...
}
对我来说,你的setY
刹车设置方法责任。您应该避免在 setter 方法中隐藏类逻辑的情况。更好的解决方案是创建新的计算方法:
point.setX(10);
point.setY(11);
point.calculateSomething();