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

使用Jackson XML Mapper解析格式错误的OFX XML时遇未闭合标签问题

解决格式错误OFX XML的Jackson反序列化问题

要解析这种缺失闭合标签的OFX XML,核心是先让XML解析器容忍格式错误,再结合Jackson XML的配置完成反序列化,具体步骤如下:

1. 配置Woodstox解析器开启宽松模式

Jackson XML默认使用Woodstox作为StAX实现,默认不允许缺失闭合标签,需要手动开启对应的宽松配置:

// 初始化Woodstox输入工厂并启用缺失闭合标签容忍
WstxInputFactory inputFactory = new WstxInputFactory();
inputFactory.configure(WstxInputProperties.P_ALLOW_MISSING_CLOSING_TAGS, true);

如果你的项目还没引入Woodstox依赖,需要在Maven/Gradle中添加(以Maven为例):

<dependency>
    <groupId>com.fasterxml.woodstox</groupId>
    <artifactId>woodstox-core</artifactId>
    <version>6.5.1</version> <!-- 使用最新稳定版 -->
</dependency>

2. 调整XmlMapper配置,注入自定义解析器

把配置好的Woodstox输入工厂传给XmlMapper,保留你原有的配置:

XmlMapper xmlMapper = XmlMapper.builder()
        .xmlInputFactory(inputFactory) // 注入宽松配置的解析器
        .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
        .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
        .configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
        .build();

3. 编写对应实体类,匹配XML结构

根据OFX的XML结构编写实体类,用@JacksonXmlProperty指定标签名,避免因为标签名大小写、特殊字符(比如INTU.BID)导致映射失败:

Status类

public class Status {
    @JacksonXmlProperty(localName = "CODE")
    private String code;

    @JacksonXmlProperty(localName = "SEVERITY")
    private String severity;

    @JacksonXmlProperty(localName = "MESSAGE")
    private String message;

    // 无参构造函数、getter、setter(Jackson需要无参构造)
}

Sonrs类

public class Sonrs {
    @JacksonXmlProperty(localName = "STATUS")
    private Status status;

    @JacksonXmlProperty(localName = "DTSERVER")
    private String dtServer;

    @JacksonXmlProperty(localName = "LANGUAGE")
    private String language;

    @JacksonXmlProperty(localName = "INTU.BID")
    private String intuBid;

    // 无参构造函数、getter、setter
}

Signonmsgsrsv1类

public class Signonmsgsrsv1 {
    @JacksonXmlProperty(localName = "SONRS")
    private Sonrs sonrs;

    // 无参构造函数、getter、setter
}

OFX根类

@JacksonXmlRootElement(localName = "OFX")
public class OFX {
    @JacksonXmlProperty(localName = "SIGNONMSGSRSV1")
    private Signonmsgsrsv1 signonmsgsrsv1;

    // 无参构造函数、getter、setter
}

4. 执行反序列化

用配置好的XmlMapper读取XML内容即可:

String xml = "<OFX>\n<SIGNONMSGSRSV1>\n    <SONRS>\n        <STATUS>\n            <CODE>0\n            <SEVERITY>INFO\n            <MESSAGE>OK\n        </STATUS>\n        <DTSERVER>20220904084713[-5]\n        <LANGUAGE>ENG\n        <INTU.BID>00315\n    </SONRS>\n</SIGNONMSGSRSV1>\n</OFX>";
OFX ofx = xmlMapper.readValue(xml, OFX.class);

原理说明

开启ALLOW_MISSING_CLOSING_TAGS后,Woodstox解析器会在遇到下一个标签的起始标记时,自动认为上一个未闭合的标签已经结束,以此兼容这种格式错误的XML。Jackson XML则基于处理后的正确结构完成属性映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:45:36