为了获取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就好了