FasterXML-Jackson XML扩展:XML转POJO部分值为null问题排查
我之前在项目里用Jackson XML做转换时也踩过类似的坑,几个常见的排查方向应该能帮你定位问题:
检查元素名称与字段的匹配度
Jackson XML对名称大小写是敏感的!比如XML里是<UserAge>,但POJO字段是userAge,就会匹配失败导致值为null。如果名称不一致,记得给字段加上@JacksonXmlProperty(localName = "XML里的元素名")注解,示例:@JacksonXmlProperty(localName = "UserAge") private Integer userAge;处理XML命名空间
如果你的XML开头带有命名空间(比如xmlns="http://your-domain.com/ns"),而POJO没对应配置的话,Jackson会识别不到元素。解决方式:- 在POJO类上添加
@JacksonXmlRootElement(namespace = "你的命名空间URI") - 或者在单个字段上用
@JacksonXmlProperty(namespace = "命名空间URI", localName = "元素名")指定
- 在POJO类上添加
核对嵌套元素的层级结构
在线工具生成POJO时偶尔会搞混嵌套层级。比如XML是<Order><Customer><Name>John</Name></Customer></Order>,但生成的POJO可能把Name直接放在Order类里,这时候转换自然拿不到值。要确保POJO的层级和XML完全对应。确认字段的访问权限
Jackson默认需要通过setter方法注入值,如果POJO字段是private且没有对应的setter,就会导致值为null。你可以:- 给字段添加对应的getter/setter
- 或者配置XmlMapper允许直接访问私有字段:
XmlMapper xmlMapper = new XmlMapper(); xmlMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
处理特殊格式的XML元素
如果那些为null的属性对应的XML是CDATA块(比如<Description><![CDATA[Some content]]></Description>),需要给POJO字段加上@JacksonXmlCData注解才能正确解析。另外也要检查元素值是不是为空或者有特殊字符干扰。确认XML元素确实存在
最后别忘了核对原始XML字符串,看看那些为null的属性对应的元素是不是真的存在,有没有拼写错误或者元素缺失的情况。
内容的提问来源于stack exchange,提问作者dushkin

