使用Jackson反序列化XML列表时出现MismatchedInputException异常
解决Jackson XML反序列化列表对象的问题
问题原因
你遇到的反序列化异常,是因为在使用@JsonCreator注解显式指定构造函数时,字段上的@field:前缀注解没有被Jackson正确关联到构造函数参数上,导致Jackson无法识别XML中的<categories>包装节点和<category>子节点的对应关系,进而无法将XML结构映射到List<Category>类型。
解决方案
有两种可行的修改方式:
方式一:将注解直接应用到构造函数参数上
去掉注解的@field:前缀,把注解直接加在构造函数的参数上,让Jackson在使用构造函数反序列化时能正确识别映射规则:
@JacksonXmlRootElement(localName = "response") data class CategoriesResponse @JsonCreator constructor( @JacksonXmlElementWrapper(localName = "categories") @JacksonXmlProperty(localName = "category") val categoryList: List<Category> ) data class Category @JsonCreator constructor( @JacksonXmlProperty(isAttribute = true) val id: Int )
方式二:移除@JsonCreator注解
Kotlin的data类默认构造函数可以被Jackson自动识别,无需显式添加@JsonCreator注解。移除该注解后,字段上的@field:注解可以正常生效:
@JacksonXmlRootElement(localName = "response") data class CategoriesResponse( @field:JacksonXmlElementWrapper(localName = "categories") @field:JacksonXmlProperty(localName = "category") val categoryList: List<Category> ) data class Category( @field:JacksonXmlProperty(isAttribute = true) val id: Int )
验证效果
修改后重新运行代码,序列化生成的XML结构保持不变,反序列化时可以正常将XML转换为CategoriesResponse对象,不会再抛出类型不匹配的异常。
内容的提问来源于stack exchange,提问作者Chaps
相关产品推荐
相关产品推荐

