使用jackson-dataformat-xml读取XML的traits字段反序列化错误求助
错误原因
- 未为Student类的traits列表指定Jackson XML的包装标签和子元素标签,Jackson默认将
<traits>标签识别为单个对象,无法直接转换为List<Trait>,因此抛出类型不匹配错误 - Trait实体类的字段映射配置错误,无法正确解析
<trait>标签内的文本内容 - Trait类的主键配置逻辑错误,字符串类型字段搭配序列生成器会引发后续持久化异常
注意:需提前导入jackson-dataformat-xml依赖,所有XML相关注解均来自
com.fasterxml.jackson.dataformat.xml.annotation包。
解决步骤
1. 补充Student类的Jackson XML注解
在traits字段上添加两个注解,明确指定外层包装标签为traits,列表元素标签为trait:
@OneToMany (cascade = CascadeType.ALL) @JacksonXmlElementWrapper(localName = "traits") @JacksonXmlProperty(localName = "trait") private List<Trait> traits;
2. 修正Trait实体类
调整字段结构,单独设置数字主键,新增字段存储trait的文本内容,同时添加@JacksonXmlText注解让Jackson直接读取<trait>标签内的文本赋值给对应字段:
@Table @Data @Entity public class Trait { @SequenceGenerator( name = "trait_sequence", sequenceName = "trait_sequence", allocationSize = 1 ) @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "trait_sequence" ) @Id private Long id; @JacksonXmlText private String content; public Trait() { } }
可选优化方案
如果不需要单独为Trait建表存储,你之前注释掉的@ElementCollection方案更简洁,仅调整Student类即可,无需单独定义Trait实体类:
@ElementCollection @JacksonXmlElementWrapper(localName = "traits") @JacksonXmlProperty(localName = "trait") private List<String> traits;
以上修改完成后重新运行解析逻辑,即可正常读取traits列表。
内容的提问来源于stack exchange,提问作者Twisted Katie
相关产品推荐
相关产品推荐

