You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:17:22