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

SpringBoot中Jackson解析XML仅获最后节点问题求助

问题排查与解决

你这个问题90%是因为实体类没正确配置Jackson XML的集合注解,导致多个<cpe-item>被当成单个属性覆盖,只留下最后一个。下面是具体排查和修复步骤:

1. 检查实体类的注解配置

先看你的根节点实体类,要是写成下面这样肯定会丢数据:

// 错误示例:用单个对象接收集合节点,后面的会覆盖前面的
public class CpeRoot {
    private CpeItem cpeItem;

    // getter/setter
}

正确的写法必须用集合类型,配合Jackson的XML注解指定节点名称:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.util.List;

@JacksonXmlRootElement(localName = "你的根节点名称")
public class CpeRoot {
    // 如果XML里所有<cpe-item>直接在根节点下,设置wrapElementName=false
    @JacksonXmlElementWrapper(wrapElementName = false)
    @JacksonXmlProperty(localName = "cpe-item")
    private List<CpeItem> cpeItems;

    // getter和setter必须要有,不然Jackson反射拿不到
    public List<CpeItem> getCpeItems() {
        return cpeItems;
    }

    public void setCpeItems(List<CpeItem> cpeItems) {
        this.cpeItems = cpeItems;
    }
}

对应的CpeItem类要和XML节点字段对应,比如:

public class CpeItem {
    @JacksonXmlProperty(localName = "name") // 对应XML里的<name>节点
    private String name;
    @JacksonXmlProperty(localName = "title") // 对应XML里的<title>节点
    private String title;

    // getter/setter
}

2. 核对你的测试XML结构

假设你的测试XML是这样的:

<root>
    <cpe-item>
        <name>cpe:2.3:a:john:demo:1.0:*:*:*:*:*:*:*</name>
        <title>John's Demo App</title>
    </cpe-item>
    <cpe-item>
        <name>cpe:2.3:a:jane:tool:2.0:*:*:*:*:*:*:*</name>
        <title>Jane's Tool</title>
    </cpe-item>
</root>

如果你的根节点就是直接多个<cpe-item>(没有外层<root>),那CpeRoot的@JacksonXmlRootElement可以去掉,或者保持配置不变。

3. 解析代码验证

确保你的解析代码是读取集合对象,比如:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.File;

public class XmlParseTest {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        CpeRoot root = xmlMapper.readValue(new File("test.xml"), CpeRoot.class);
        // 打印集合大小,正常应该是2
        System.out.println(root.getCpeItems().size());
    }
}

容易踩的坑

  • 集合字段用了单个对象类型(比如CpeItem而非List<CpeItem>),直接导致覆盖
  • 注解的localName和XML节点名大小写不匹配(Jackson XML默认大小写敏感)
  • 忘记加@JacksonXmlElementWrapper,或者设置错误的包裹节点名称

内容的提问来源于stack exchange,提问作者SREEJITH K S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:40:45