0
나는 값 객체를 Jackson을 사용하여 직렬화 및 비 직렬화했습니다.잭슨을 사용하여 순차적으로 deserialize합니다.
VO에는 x와 y 두 개의 필드가 있습니다. 그러나 setY를 호출하는 것은 x가 설정된 경우에만 의미가 있습니다. 직렬화 중에 setX가 setY보다 먼저 호출되도록하는 방법이 있습니까?
나는 값 객체를 Jackson을 사용하여 직렬화 및 비 직렬화했습니다.잭슨을 사용하여 순차적으로 deserialize합니다.
VO에는 x와 y 두 개의 필드가 있습니다. 그러나 setY를 호출하는 것은 x가 설정된 경우에만 의미가 있습니다. 직렬화 중에 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;
}
}
그런 다음 Jackson에게 위의 디시리얼라이저를 사용하도록 지시해야합니다. 예를 들어,이 방법 :
나를 위해@JsonDeserialize(using = PointJsonDeserializer.class)
class Point {
...
}
, 당신의 setY
브레이크 setter 메소드 책임. setter 메소드에서 클래스 로직을 숨기는 상황을 피해야합니다. 더 좋은 솔루션은 계산을위한 새로운 방법을 만드는 것입니다.
point.setX(10);
point.setY(11);
point.calculateSomething();
지오버 귀하의 회신에 감사드립니다! x를 설정하면 x의 값을 수정해야합니까? – Neel
질문을 이해할 수 없습니다. 좀 더 자세한 정보를 주시겠습니까? –
Ziober : 오타가 잘못되었습니다. "y를 설정하면 'x'의 값을 수정해야합니까?이 경우 calculateSomething은 'y'에 대한 setter 내부에서 호출됩니다. 왜냐하면 코드가 있어야하기 때문입니다. – Neel