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

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,自然失败。

具体修正步骤

  1. 替换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;
    }
    
  2. 排除Lombok问题:
    你用的@Getter @Setter @NoArgsConstructor已经正确生成了无参构造、setter和getter,Jackson完全兼容,不是Lombok的锅。
  3. 确保XML格式合法:
    原XML片段缺少闭合标签,实际解析时必须保证<FINSTA03>和<FINSTA>都正确闭合,否则也会引发解析异常。

内容的提问来源于stack exchange,提问作者Leos Literak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:46:17