使用Jackson XmlMapper序列化含转义双引号字符串到XML异常如何解决
解决Jackson XmlMapper序列化含转义双引号字符串内容重复问题
问题根因
该问题通常由三类原因导致:
- 2.13.x及更早版本的Jackson XML模块存在已知bug,序列化包含特殊转义字符的字符串时会触发重复写入逻辑
- 待序列化类的字段可见性配置冲突,序列化器同时读取了成员变量和对应getter方法的返回值,导致内容重复拼接
- 底层StAX实现(默认woodstox)的输出配置异常,双引号转义时触发了缓冲区内容重复写入
解决方案
方案1:升级Jackson版本(优先推荐)
直接将jackson-dataformat-xml依赖升级到2.15.0及以上稳定版本,官方已在后续版本修复了该转义字符导致的重复输出bug,无需修改业务代码即可解决问题。
方案2:补充序列化注解
在待序列化类的对应字符串字段上添加@JacksonXmlText注解,明确标记该字段为标签内纯文本内容,避免序列化器重复读取:
public class Variables { @JacksonXmlText private String example; // 其他字段、getter/setter }
如果是字段和getter同时被检测到导致重复,可在类上添加注解关闭重复检测:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE) public class Variables { // 类内容 }
方案3:调整XmlMapper输出配置
如果无法升级版本,可手动修改StAX输出工厂的配置,规避转义触发的重复写入:
XmlMapper xmlMapper = new XmlMapper(); // 配置woodstox输出属性,关闭转义时的自动缓冲区刷新 xmlMapper.getFactory().getXMLOutputFactory() .setProperty(com.ctc.wstx.api.WstxOutputProperties.P_OUTPUT_ESCAPE_CR, false); xmlMapper.getFactory().getXMLOutputFactory() .setProperty(com.ctc.wstx.api.WstxOutputProperties.P_AUTO_CLOSE_OUTPUT, false); String xml = xmlMapper.writeValueAsString(variables);
内容的提问来源于stack exchange,提问作者ftk43
相关产品推荐
相关产品推荐

