JacksonXML反序列化在没有字符串参数构造函数/工厂方法从String反序列化时失败

hs1ihplo  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(120)

我试着用Jackson解析XML。我已经从XSD生成了java DTO,所以没有使用camel case,命名约定在那里没有意义。
豆子:

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 version="1.0" encoding="windows-1250"?>
<FINSTA>
    <STA_VER>01.0000</STA_VER>
    <FINSTA03>
        <S28_CISLO_VYPISU>10</S28_CISLO_VYPISU>

错误:

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设置器或构造器不兼容吗?
如果我删除<FINSTA03>子元素,我就能够正确地加载FINSTABean

5anewei6

5anewei61#

这里的主要问题是关于FINSTA03BeanList列表的,因为你没有用特定的JacksonXmlElementWrapper注解来注解它,这会导致错误,因为Jackson库把你的列表误解为一个单一的属性。你也可以用xml特定的JacksonXmlProperty注解来代替JsonProperty来表示属性:

@Getter
@Setter
@NoArgsConstructor
public class FINSTABean {
    @JacksonXmlProperty
    String STA_VER;
    @JacksonXmlProperty(localName = "FINSTA03")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<FINSTA03Bean> FINSTA03BeanList;
}

@Getter
@Setter
@NoArgsConstructor
public class FINSTA03Bean {
    @JacksonXmlProperty
    String S28_CISLO_VYPISU;
}

相关问题