2013-09-25 85 views
3

在Spring 3.3中,我有一個映射到數據庫表的實體。在這個實體類中,我擁有用@JsonProperty註解的所有特性,例如@JsonProperty(「ID」)。 進入控制器,通過使用DAO /存儲庫調用服務來獲取這樣的實體。這很好,但是當我使用@ResponseBody將此實體發送回請求者時,所有屬性都會發送兩次。一旦需要,但再多一次開始小寫,直到發生第一個駱駝案例。 一個例子...實體屬性序列化兩次

public class MyEntity { 
    @JsonProperty("MYSpecialSuperId") 
    private String MYSpecialSuperId; 

    ... 

    public String getMYSpecialSsuperId() { 
     return this.MYSpecialSuperId; 
    } 

} 

JSON字符串化的結果之後是:

{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" } 

爲什麼物業兩次的結果,爲什麼刻字不同???

另請參考: 讓Java屬性以大寫字母開頭,即使還有一個以上的大寫字母也不是我的想法。

+0

我認爲這是相同的問題:http://stackoverflow.com/questions/7557397/jackson-json-java-class-fields-are-serialized-multiple-times,甚至這個:http:// stackoverflow .com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferred-worldwide – Katona

回答

6

Jackson's ObjectMapper使用Java bean模式。換句話說,它預計以下

public class Foo { 
    public Object bar; 

    public Object getBar() {...} 

    public void setBar(Object bar) {...} 
} 

getter和setter開始getset,分別,接着用其首字母相應的字段名稱大寫。如果你改變你的代碼

public class MyEntity { 
    @JsonProperty("MYSpecialSuperId") 
    private String mySpecialSuperId; 

    ... 

    public String getMySpecialSuperId() { 
     return this.mySpecialSuperId; 
    } 

} 

注意,場小寫my而不是大寫(無論@JsonProperty值)開始,我在getMYSpecialSsuperId去除多餘的s和使用小寫y。所以現在字段名稱與getter名稱相匹配,jackson知道該屬性是相同的,不需要序列化兩次。

如果你沒有選擇,你可以遵循什麼Katona posted in the comments和使用

@JsonAutoDetect(getterVisibility=Visibility.NONE) 

使傑克遜完全忽略getter和只使用領域的序列化JSON的。

+0

嗯,我沒有選擇更改屬性名稱(但我正在處理此問題;))。因此,一些屬性被命名爲: ABCDOneOfMyProperty(我討厭它,但我必須忍受它)。 @JsonAutoDetect(getterVisibility = Visibility.NONE)註解做了訣竅。謝謝。 :)) –

1

我認爲你的訪問者有一個錯字;如果它有「SsuperId」它不匹配字段的名稱;因爲這樣的領域和吸氣劑被認爲是不同的邏輯性質。

+0

僅憑這一點就無法解決整體問題。 –

+0

問題是由於從getter提取的名稱,字段名稱之間的不匹配:我猜這是由於非標準命名(多個大寫字母作爲前綴)。您可能需要爲getter重複'@ JsonProperty'註釋。 – StaxMan

+0

對不起。我的手指應該歸咎於這個錯字。 ;) 在真正的代碼中,我沒有這個錯字......只有在這裏問這個問題。 –