Jackson XML 解析器在标记时失败

问题描述

当出现如下属性时,Jackson XML 解析器会失败:

<some-float-value fr:relevance="true">99</some-float-value>

错误日志如下所示:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.Float` out of START_OBJECT token

如果我删除属性,那么这个字段看起来像这样,那就没问题了:

<some-float-value>99</some-float-value>

我想解析的类是这样的:

@JsonIgnoreProperties(ignoreUnkNown = true)
public class Example {
    @JacksonXmlProperty(localName = "some-float-value")
    private Float someValue;
}

解决方法

如果没有 fr 命名空间,@JsonIgnoreProperties(ignoreUnknown = true) 注释足以忽略 relevance 属性,但不幸的是,情况并非如此:如果您想摆脱 xml 文件中的命名空间,您可以指示您的 XmlMapper 忽略它们传递自定义 XmlFactory 作为构造函数参数,如下所示:

XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,Boolean.FALSE);
XmlMapper  mapper = new XmlMapper(new XmlFactory(input,new WstxOutputFactory()));
Example example = mapper.readValue(xml,Example.class);

您还必须使用 Example 注释和 JacksonXmlRootElement 注释修改您的 JacksonXmlText 类,如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "some-float-value")
public class Example {
    
    @JacksonXmlText
    private Float someValue;
}   
,

通过从 Jackson 版本 2.11.3 升级到 2.12.3 来解决