0

Jackson を使用してシリアル化および逆シリアル化された値オブジェクトがあります。

VO には、x と y の 2 つのフィールドがあります。ただし、setY の呼び出しは、x が設定されている場合にのみ意味があります。逆シリアル化中に 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;
    }
}

その後、上記のデシリアライザーを使用するように Jackson に指示する必要があります。たとえば、次のようにします。

@JsonDeserialize(using = PointJsonDeserializer.class)
class Point {
     ...
}

私にとっては、あなたのsetYブレーキセッターメソッドの責任です。セッターメソッドでクラスロジックを隠すような状況は避けるべきです。より良い解決策は、計算のための新しい方法を作成することです:

point.setX(10);
point.setY(11);
point.calculateSomething();
于 2013-10-03T19:12:02.967 に答える