為了獲取xml數據,在spring mvc中針對 @ResponseBody配置了jackson。
剛用的時候內心是狂喜的,終於不用自己解析了…………
but…………………………還是有坑的……
坑一:大小寫問題
@JacksonXmlProperty(localName = "Apid")
private Integer Apid;
private Integer getApid()
{
return this.Apid
}
把注解放在成員變量上面,會解析出兩個apid字段,一個是<Apid></Apid>,另一個是<apid><apid>
這是因為Jackson的處理機制會自動從屬性方法上獲取成員變量名,然而在java中,要么以駝峰命名,要么前兩個字母都大寫,才能用get方法正確地獲取屬性,所以使用getApid獲取的成員名稱就是apid,被jackson解析了出來。又因為成員變量上也加了注解,所以也會被解析。這就造成了xml文件生成了兩個apid標簽。正確的做法是把注解寫到get方法上面
正確寫法:
private Integer Apid;
@JacksonXmlProperty(localName = "Apid")
private Integer getApid()
{
return this.Apid
}
坑二:Jackson封裝list問題
這個問題排查的時候異常困難……開始以為是封裝的問題…………(吐槽一下,這個外包項目使用大量xml交互,但是又用不了webservice就得按照固定格式解析封裝xml.....改動也賊困難。。。)……最后還是確定了是jackson的問題
private List<Integer> APID;
@JacksonXmlProperty(localName = "APID")
@JacksonXmlElementWrapper(useWrapping = false)
public List<Integer> getAPID() {
return APID;
}
開始APID這個list一直被包裝了兩層!正確結果應該是<APID>111</APID>
但是得到的是<APID><APID>111</APID></APID>
問題出在JacksonXmlElementWrapper……………………如果不指定的話這個值默認是true………………………………………………………………………………………………
為true的時候Jackson封裝xml直接用xmlProperty的localName又封了一層…
把這里改成false就好了