将含列表的XML反序列化为POJO时TOV字段为空的问题排查
问题解答
嘿,我来帮你搞定这两个问题!
1. TOV对象为null的解决方法
是的,你需要通过Jackson的XML注解来明确字段与XML节点的映射关系,尤其是当字段名和XML节点名的匹配存在大小写或命名风格差异时。
你的asset类里的TOV字段为null,核心原因是Jackson XML默认的映射规则无法正确识别XML中的<TOV>节点与POJO字段的关联。你需要给asset类的TOV字段添加@JacksonXmlProperty注解,指定对应的XML节点名;同时要确保项目已经引入了jackson-dataformat-xml依赖(Maven/Gradle均可)。
修改后的asset类示例(建议类名大写开头,符合Java规范):
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import lombok.Getter; import lombok.Setter; public class Asset { @Getter @Setter private String id; @Getter @Setter @JacksonXmlProperty(localName = "TOV") // 明确关联XML中的<TOV>节点 private TOV tov; }
2. 将credit和castCrew存入Java List是否可行?
完全可行!Jackson XML支持自动将多个同名的XML子节点收集到List中,但有一个关键细节需要注意:禁用Jackson的默认包装器。
因为你的XML里没有包裹所有<credit>/<castCrew>节点的父容器(比如<credits>或<castCrews>),所以需要给TOV类里的credit和castCrew字段添加@JacksonXmlElementWrapper(useWrapping = false)注解,告诉Jackson直接把同名子节点收集到List里,而不是去寻找不存在的包裹节点。
修改后的TOV类示例:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import lombok.Getter; import lombok.Setter; import java.util.List; public class TOV { @Getter @Setter private String episodeNumber; @Getter @Setter private String music; @Getter @Setter private String artist; @Getter @Setter @JacksonXmlElementWrapper(useWrapping = false) // 禁用默认包装器 private List<Credit> credit; // 类名建议修正为大写开头的Credit @Getter @Setter @JacksonXmlElementWrapper(useWrapping = false) // 禁用默认包装器 private List<CastCrew> castCrew; // 类名建议修正为大写开头的CastCrew }
对应的子类也建议修正类名并确保字段映射正确:
import lombok.Getter; import lombok.Setter; public class Credit { @Getter @Setter private String biography; }
import lombok.Getter; import lombok.Setter; public class CastCrew { @Getter @Setter private String role; @Getter @Setter private String name; }
最后,记得使用XmlMapper而非普通ObjectMapper来解析XML:
import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class XmlParseDemo { public static void main(String[] args) throws Exception { String xmlContent = "<asset id=\"35465146\"> <TOV artist=\"\" music=\"0\" episodeNumber=\"\"> <credit biography=\"\" /> <credit biography=\"\" /> <credit biography=\"\" /> <credit biography=\"\" /> <castCrew role=\"Actor\" name=\"John C. Reilly\"/> <castCrew role=\"Director\" name=\"Keith Scholey\"/> <castCrew role=\"Director\" name=\"Alastair Fothergill\"/> <castCrew role=\"Director\" name=\"Adam Chapman\"/> </TOV> </asset>"; XmlMapper xmlMapper = new XmlMapper(); Asset asset = xmlMapper.readValue(xmlContent, Asset.class); // 此时asset.getTov()不再为null,credit和castCrew列表也会正确填充数据 } }
内容的提问来源于stack exchange,提问作者gabrriel_bu
相关产品推荐
相关产品推荐

