2013-10-03 23 views
0

我有一個值對象使用傑克遜序列化和反序列化。按順序反序列化使用傑克遜

VO有兩個字段:x和y。但是隻有在設置了x時調用setY纔有意義。有什麼方法可以確保在反序列化期間setX比setY早嗎?

回答

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方法的責任。你應該避免使用setter方法隱藏類邏輯的情況。更好的解決方案是創建新的計算方法:

point.setX(10); 
point.setY(11); 
point.calculateSomething(); 
+0

Ziober感謝您的迴應!如果設置x應該修改x的值會怎樣? – Neel

+0

我不明白你的問題。你能否給我更多的細節? –

+0

Ziober:對不起,這是一個拼寫錯誤 - 我的意思是:「如果設置'y'應該修改'x'的值呢?在這種情況下,calculateSomething會在'set'中被調用,因爲代碼應該是緊密耦合 – Neel