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

Java中XmlMapper反序列化自动生成POJO对应XML报错如何解决

问题根因

报错核心是两个配置缺失导致的解析层级错位:

  1. Jackson 默认不会识别 JAXB 自动生成的 POJO 上的 @XmlElement 等 JAXB 注解,无法正确映射 XML 标签和实体属性的对应关系,也无法正确识别列表字段的映射规则
  2. 列表嵌套层级解析错位,导致 <Field> 标签的内容被错误匹配到上层 EntityType 类的属性中,才会出现「EntityType 类不存在 field 属性」的报错

解决方案

两种方案都不需要修改自动生成的 POJO 或原始 XSD 文件:

方案一:注册 JAXB 注解支持模块

让 Jackson 直接识别 POJO 上的 JAXB 注解完成映射,适配性最好:

  1. 首先添加对应依赖(版本需和你使用的 jackson-dataformat-xml 版本完全一致),Maven 示例:
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>你的Jackson版本号</version>
</dependency>
  1. 调整 XmlMapper 配置,注册 JAXB 注解模块:
XmlMapper xmlMapper = XmlMapper.builder()
        // 注册JAXB注解支持模块,识别POJO上的@XmlElement等注解
        .addModule(new JaxbAnnotationModule())
        // 关闭默认列表包装,适配当前XML的无额外wrapper标签的列表结构
        .defaultUseWrapper(false)
        // 开启大小写不敏感,适配XML标签名和实体属性名的大小写差异
        .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
        .build();

方案二:使用 MixIn 注解自定义映射规则

如果部分 JAXB 注解没有正常生成(比如示例中 EntityRecordType 的 field 字段没有生成 @XmlElement 注解),可以用 MixIn 机制无侵入式添加映射规则:

  1. 定义 MixIn 接口(不需要实现):
// ListOfEntitiesType 映射规则
interface ListOfEntitiesTypeMixIn {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonProperty("Entity")
    List<EntityType> getEntity();
}

// EntityType 映射规则
interface EntityTypeMixIn {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonProperty("EntityRecord")
    List<EntityRecordType> getEntityRecord();
}

// EntityRecordType 映射规则
interface EntityRecordTypeMixIn {
    @JsonProperty("Field")
    String getField();
}
  1. 调整 XmlMapper 配置,注册 MixIn:
XmlMapper xmlMapper = XmlMapper.builder()
        .defaultUseWrapper(false)
        .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
        // 注册自定义映射规则
        .addMixIn(ListOfEntitiesType.class, ListOfEntitiesTypeMixIn.class)
        .addMixIn(EntityType.class, EntityTypeMixIn.class)
        .addMixIn(EntityRecordType.class, EntityRecordTypeMixIn.class)
        .build();

内容的提问来源于stack exchange,提问作者Григорий Степанов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:15:02