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
相关产品推荐
相关产品推荐

