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

Jackson XML ArrayList反序列化问题:无法解析带属性的空Transform标签

问题解决:Jackson XML反序列化空标签属性丢失

问题根源

你的代码存在两个关键问题:

  1. 列表包装器配置错误:@JacksonXmlElementWrapper默认会期望列表被一个额外的包装元素包裹,但原XML中<ds:Transforms>直接包含<ds:Transform>子元素,不需要额外层级。
  2. 命名空间未匹配:XML中的ds前缀对应XML-DSig的标准命名空间,实体类未指定该命名空间,导致Jackson无法识别带前缀的元素,直接忽略了<ds:Transform>节点。

修复方案

1. 修改Transforms实体类

添加命名空间配置,并禁用列表包装器:

@Data
@JacksonXmlRootElement(namespace = "http://www.w3.org/2000/09/xmldsig#", localName = "Transforms")
public class Transforms {
    @JacksonXmlProperty(namespace = "http://www.w3.org/2000/09/xmldsig#", localName = "Transform")
    @JacksonXmlElementWrapper(useWrapping = false) // 禁用默认包装,直接映射子元素到列表
    private List<Transform> transform;
}

2. 修改Transform实体类

为属性指定对应命名空间:

@Data
public class Transform {
    @JacksonXmlProperty(
        isAttribute = true,
        namespace = "http://www.w3.org/2000/09/xmldsig#",
        localName = "Algorithm"
    )
    private String algorithm;
}

3. 反序列化代码示例

使用XmlMapper正常反序列化即可:

String xmlContent = "<ds:Transforms xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\n" +
                    "   <ds:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped\"/>\n" +
                    "   <ds:Transform Algorithm=\"http://www.w3.org/TR/2001/REC\"/>\n" +
                    "</ds:Transforms>";

XmlMapper xmlMapper = new XmlMapper();
Transforms transforms = xmlMapper.readValue(xmlContent, Transforms.class);
// 此时transforms.getTransform()会返回包含两个Transform对象的列表,每个对象的algorithm属性正确赋值

关键说明

  • @JacksonXmlElementWrapper(useWrapping = false):告诉Jackson不需要为列表创建额外的包装元素,直接将父节点下的所有同名子节点映射到列表中。
  • 命名空间指定:必须与XML中ds前缀绑定的命名空间一致(标准XML-DSig命名空间为http://www.w3.org/2000/09/xmldsig#),否则Jackson无法识别带前缀的元素。

内容的提问来源于stack exchange,提问作者FPS Bard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:21:06