使用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
相关产品推荐
相关产品推荐

