2013-04-15 2 views
16

속성에 대한 getter 및 setter와의 간단한 인터페이스가 있습니다.역 직렬화시 속성 무시

public interface HasMoney { 

     Money getMoney(); 

     void setMoney(Money money); 

} 

이 인터페이스를 구현하는 또 다른 클래스 인 UserAccount가 있습니다.

public class UserAccount implements HasMoney { 

     private Money money; 

     @Override 
     Money getMoney() // fill in the blanks 

     @Override 
     void setMoney(Money money) // fill in the blanks 

} 

내 문제는 내가 돈 속성을 직렬화하지만 즉,이 속성에 대한 사용자로부터 어떤 값을 허용 해달라고 deserialize하는 동안 무시해야한다는 것입니다. 나는 setter에 @JsonIgnore를 시도하고 getter에 @JsonIgnore (false)를 시도했지만 무시한다. 그러나 그것을 직렬화하는 동안에도 그렇게한다.

저는 setter에서 @JsonIgnore를 시도하고 getter에서 @JsonProperty를 사용하여 Jackson에게 우리가이 속성을 추적하려고한다고 명시 적으로 말했습니다. 돈 속성이 서버로 보내지면서 Jackson이 그것을 역 직렬화하려고 시도 할 때 응용 프로그램이 손상되는 것 같습니다. Throwing MalformedJsonException : Money 유형의 객체를 생성 할 수 없습니다.

가장 이상한 점은 setter에서 @JsonIgnore를 설정하고 setter에서 @JsonProperty를 설정하면 대부분의 경우 속성이 프리미티브 일 때 효과가 있다는 것입니다.

답변

10

그래, @JsonIgnore의 동작이 1.9 이상에서 크게 바뀌 었습니다 (더 나쁜 경우). 당신의 재산이 직렬화 복원시에 무시되지 않는 이유의 악마 세부 사항으로하지 않고, 그것을 해결하기 위해이 코드를 시도 :

public class UserAccount implements HasMoney { 
    @JsonIgnore 
    private BigDecimal money; 

    // Other variable declarations, constructors 

    @Override 
    @JsonProperty 
    public BigDecimal getMoney() { 
     return money; 
    } 

    @JsonIgnore 
    @Override 
    public void setMoney(final BigDecimal money) { 
     this.money = money; 
    } 

    // Other getters/setters 
} 

주에게 클래스 변수에 @JsonIgnore의 사용을 - 그 작업 솔루션이 필요합니다.

참고 : 사용자 환경 및 사용 사례에 따라, 당신은, 예를 들어, ObjectMapper 인스턴스 AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS USE_GETTERS_AS_SETTERS을 추가 구성이 필요할 수 있습니다.

+1

. 또한 objectMapper.disable (MapperFeature.USE_GETTERS_AS_SETTERS)을 추가해야만했습니다. 답을 수정하면 받아 들일 것입니다. 슬프게도 이것에 대한 더 깨끗한 방법은 없다 (Atleast 나는 그것을 찾을 수 없었다). –

+0

@NishantNagwani -이 기능을 사용하지 않으면 이상하게 작동합니다. 내 대답에 선택적 메모를 추가하는 중이지만'USE_GETTERS_AS_SETTERS'를 필요로하는 설정과 다른 점이 있는지 궁금합니다. – Perception

+0

나는 그것을 다시 시험해 보았다. 내 환경에서 작동하지 않습니다. 나는 잭슨 2.1.1을 사용하고있다. 내가 얻은 오류는 다음과 같습니다 { "메시지에 변형 된 json이 사용되었습니다. 사용 된 데이터 유형이 잘못되었습니다. \ n 'setterless'속성 'money'를 직렬화 해제하는 중 : get 메소드가 참조 체인 : com.abc를 통해 null을 반환했습니다. def.Money]) " } –

17

버전 2.6.0+에서는 클래스 수준에서 @JsonIgnoreProperties를 사용하여이 작업을 수행 할 수 있습니다.

@JsonIgnoreProperties(value={ "money" }, allowGetters=true) 

이 폐쇄 문제에서보세요 :이 실제로 솔루션의 일부입니다 https://github.com/FasterXML/jackson-databind/issues/95

+1

이 솔루션은 더 깨끗합니다. –

관련 문제