2013-10-03 2 views
0

나는 값 객체를 Jackson을 사용하여 직렬화 및 비 직렬화했습니다.잭슨을 사용하여 순차적으로 deserialize합니다.

VO에는 x와 y 두 개의 필드가 있습니다. 그러나 setY를 호출하는 것은 x가 설정된 경우에만 의미가 있습니다. 직렬화 중에 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; 
    } 
} 

그런 다음 Jackson에게 위의 디시리얼라이저를 사용하도록 지시해야합니다. 예를 들어,이 방법 :

나를 위해
@JsonDeserialize(using = PointJsonDeserializer.class) 
class Point { 
    ... 
} 

, 당신의 setY 브레이크 setter 메소드 책임. setter 메소드에서 클래스 로직을 숨기는 상황을 피해야합니다. 더 좋은 솔루션은 계산을위한 새로운 방법을 만드는 것입니다.

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

지오버 귀하의 회신에 감사드립니다! x를 설정하면 x의 값을 수정해야합니까? – Neel

+0

질문을 이해할 수 없습니다. 좀 더 자세한 정보를 주시겠습니까? –

+0

Ziober : 오타가 잘못되었습니다. "y를 설정하면 'x'의 값을 수정해야합니까?이 경우 calculateSomething은 'y'에 대한 setter 내부에서 호출됩니다. 왜냐하면 코드가 있어야하기 때문입니다. – Neel

관련 문제