Jackson XML反序列化遇XML注释而非元素时失败的解决方法
解决Jackson XML反序列化时因注释导致的列表反序列化失败问题
你遇到的这个问题我之前也碰到过——Jackson的XML模块会把元素内的注释当成文本节点,而你的licenses字段定义为List<License>,这就导致解析时抛出Cannot deserialize instance of java.util.ArrayList out of VALUE_STRING token错误。你之前配置的ACCEPT_SINGLE_VALUE_AS_ARRAY只适用于单个元素转数组的场景,没法处理注释带来的文本节点问题。
下面是具体的解决方法:
配置XML输入工厂忽略注释
Jackson的XML解析依赖Stax API,我们可以先创建一个XMLInputFactory并开启忽略注释的配置,再把它传给XmlMapper:// 创建并配置XML输入工厂 XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // 关键配置:让解析器忽略XML注释 inputFactory.setProperty(XMLInputFactory.IS_IGNORING_COMMENTS, true); // 可选:添加安全相关配置,避免潜在风险 inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // 使用配置好的工厂创建XmlMapper XmlMapper xmlMapper = new XmlMapper(new XmlFactory(inputFactory));补充Jackson反序列化配置
结合你之前的配置,再添加处理空字符串的规则,确保空的licenses元素能被解析为空列表:xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);优化POJO的注解(可选但推荐)
在Dependency类的licenses字段上添加XML映射注解,明确告诉Jackson元素的层级关系,避免解析歧义:public class Dependency { // 其他字段及对应的getter/setter保持不变 @XmlElementWrapper(name = "licenses") @XmlElement(name = "license") private List<License> licenses = new ArrayList<>(1); // licenses对应的getter和setter保持不变 }
这样配置后,Jackson会自动忽略XML中的注释,把只包含注释的licenses元素解析为空列表,顺利完成反序列化。
内容的提问来源于stack exchange,提问作者Tarator
相关产品推荐
相关产品推荐

