爲了獲取xml數據,在spring mvc中針對 @ResponseBody配置了jackson。java
剛用的時候心裏是狂喜的,終於不用本身解析了…………web
but…………………………仍是有坑的……spring
坑一:大小寫問題api
@JacksonXmlProperty(localName = "Apid")mvc
private Integer Apid;app
private Integer getApid()this
{xml
return this.Apidblog
}get
把註解放在成員變量上面,會解析出兩個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就行了