Jackson XML反序列化失败:无字符串参数构造/工厂方法
问题:Jackson XML反序列化报错无法构造Bean实例
我尝试使用Jackson解析XML,从XSD生成了Java DTO,因此未使用驼峰命名,相关命名约定在此场景下不适用。
Bean代码
FINSTABean bean = xmlMapper.readValue(file, FINSTABean.class); @JsonIgnoreProperties(ignoreUnknown = true) @Getter @Setter @NoArgsConstructor public class FINSTABean { @JsonProperty("STA_VER") String STA_VER; @JsonProperty("FINSTA03") List<FINSTA03Bean> FINSTA03BeanList; } @JsonIgnoreProperties(ignoreUnknown = true) @Getter @Setter @NoArgsConstructor public class FINSTA03Bean { @JsonProperty("S28_CISLO_VYPISU") String S28_CISLO_VYPISU; String S25_CISLO_UCTU; }
XML内容
<?xml version="1.0" encoding="windows-1250"?> <FINSTA> <STA_VER>01.0000</STA_VER> <FINSTA03> <S28_CISLO_VYPISU>10</S28_CISLO_VYPISU> </FINSTA03> </FINSTA>
注:原XML片段未闭合,补充完整以保证格式合法
报错信息
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.lelifin.alfa.parsers.csob_xml.FINSTA03Bean` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('10') at [Source: (File); line: 5, column: 29] (through reference chain: com.lelifin.alfa.parsers.csob_xml.FINSTABean["FINSTA03"]->java.util.ArrayList[0]) at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1728) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1353) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:197) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.dataformat.xml.deser.XmlDeserializationContext.readRootValue(XmlDeserializationContext.java:91) ~[jackson-dataformat-xml-2.14.0.jar:2.14.0]
疑问
为何报错提示无法反序列化"10"?是否存在Lombok的setter或构造方法兼容性问题?若移除<FINSTA03>子元素,FINSTABean可正常加载。
原因分析与解决方案
核心问题
Jackson处理XML集合的逻辑和JSON不同:你用@JsonProperty映射集合字段,但Jackson XML无法正确识别<FINSTA03>是一个包含子元素的Bean实例,反而误把<S28_CISLO_VYPISU>的文本内容"10"当成了集合的元素,试图把字符串转成FINSTA03Bean,自然失败。
具体修正步骤
- 替换XML专用注解:
把FINSTABean里的集合字段注解换成Jackson XML的专用注解,明确元素映射关系:@JsonIgnoreProperties(ignoreUnknown = true) @Getter @Setter @NoArgsConstructor public class FINSTABean { @JsonProperty("STA_VER") String STA_VER; // 替换原来的@JsonProperty @JacksonXmlElementWrapper(useWrapping = false) // 不需要额外的包裹标签,直接用FINSTA03作为集合元素的标签 @JacksonXmlProperty(localName = "FINSTA03") List<FINSTA03Bean> FINSTA03BeanList; } - 排除Lombok问题:
你用的@Getter @Setter @NoArgsConstructor已经正确生成了无参构造、setter和getter,Jackson完全兼容,不是Lombok的锅。 - 确保XML格式合法:
原XML片段缺少闭合标签,实际解析时必须保证<FINSTA03>和<FINSTA>都正确闭合,否则也会引发解析异常。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

