Java中XmlMapper反序列化自动生成POJO对应XML报错如何解决
问题根因
报错核心是两个配置缺失导致的解析层级错位:
- Jackson 默认不会识别 JAXB 自动生成的 POJO 上的
@XmlElement等 JAXB 注解,无法正确映射 XML 标签和实体属性的对应关系,也无法正确识别列表字段的映射规则 - 列表嵌套层级解析错位,导致
<Field>标签的内容被错误匹配到上层EntityType类的属性中,才会出现「EntityType 类不存在 field 属性」的报错
解决方案
两种方案都不需要修改自动生成的 POJO 或原始 XSD 文件:
方案一:注册 JAXB 注解支持模块
让 Jackson 直接识别 POJO 上的 JAXB 注解完成映射,适配性最好:
- 首先添加对应依赖(版本需和你使用的
jackson-dataformat-xml版本完全一致),Maven 示例:
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>你的Jackson版本号</version> </dependency>
- 调整 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 机制无侵入式添加映射规则:
- 定义 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(); }
- 调整 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,提问作者Григорий Степанов
相关产品推荐
相关产品推荐

