0

我有一个使用 Jackson 序列化和反序列化的值对象。

VO 有两个字段:x 和 y。但是只有在设置 x 时调用 setY 才有意义。有什么方法可以确保在反序列化期间 setX 比 setY 更早被调用?

4

1 回答 1

2

您只能通过为您的 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();
于 2013-10-03T19:12:02.967 回答