2014-03-19 62 views
5

爲了簡單起見這裏是一個簡單的類:衝突的getter定義2.2.3

class GetterMethodsObject { 

    int id = 10; 

    public int getId() { 
     return id; 
    } 

    // @JsonIgnore 
    public boolean isId() { 
     return true; 
    } 
} 

序列化這個對象應該給:

{"id":10} 

,因爲是公共的getter方法。用例:

mapper=new ObjectMapper(); 
mapper.writeValueAsString(object); 

但我得到異常:

com.fasterxml.jackson.databind.JsonMappingException: 
Conflicting getter definitions for property "id": org.citi.facility.GetterMethodsObject#isId(0 params) vs org.citi.facility.GetterMethodsObject#getId(0 params) 

由於idInteger所以,我期待Jackson調用getId()方法,但不isId()isId()僅當id是布爾值時才應該調用方法?即使我把@JsonIgnore它沒有幫助。我無法改變實際的物體。如何解決這個問題?

回答

2

Jackson庫檢查getter/setters用於序列化/反序列化的方法。你可以通過下面的骯髒的黑客省略這個惱人的錯誤。你必須使用兩個註解:

  1. @JsonIgnore - 告訴Jackson忽略這個屬性
  2. @JsonProperty("isId") - 告訴Jackson在序列化過程中使用這種方法的名稱。它看起來像Jackson發現碰撞,因爲它找到了兩種方法,這兩種方法鏈接到一個字段 - id

POJO類應如下:

class GetterMethodsObject { 

    private int id = 10; 

    public int getId() { 
     return id; 
    } 

    @JsonIgnore 
    @JsonProperty("isId") 
    public boolean isId() { 
     return true; 
    } 
} 

另一種解決方案:你應該重新命名isId方法,因爲它是混亂的。您應該考慮:hasId或甚至更好hasValidId。我不知道你的isId方法在做什麼,但是你應該在方法名中提供更多信息。