如何在jackson-dataformat-xml中全局启用CDATA?
全局配置Jackson XML序列化所有字符串字段为CDATA格式
要实现全局让所有字符串字段序列化时自动包裹CDATA,无需逐个添加@JacksonXmlCData注解,可通过自定义序列化器+全局注册的方式实现:
1. 自定义字符串CDATA序列化器
继承Jackson标准字符串序列化器,重写序列化逻辑,用JacksonXmlCData包裹输出内容:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.fasterxml.jackson.dataformat.xml.ser.JacksonXmlCData; import java.io.IOException; public class GlobalCDataStringSerializer extends StdSerializer<String> { public GlobalCDataStringSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeObject(new JacksonXmlCData(value)); } }
2. 注册序列化器到XmlMapper
普通Java项目直接配置XmlMapper
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class XmlUtils { public static XmlMapper getXmlMapper() { XmlMapper xmlMapper = new XmlMapper(); SimpleModule cDataModule = new SimpleModule(); // 为所有String类型字段绑定自定义序列化器 cDataModule.addSerializer(String.class, new GlobalCDataStringSerializer()); xmlMapper.registerModule(cDataModule); return xmlMapper; } }
Spring Boot项目通过配置类注册
如果是Spring Boot环境,可通过配置Bean注入全局生效的XmlMapper:
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonXmlConfig { @Bean public XmlMapper xmlMapper() { XmlMapper xmlMapper = new XmlMapper(); SimpleModule cDataModule = new SimpleModule(); cDataModule.addSerializer(String.class, new GlobalCDataStringSerializer()); xmlMapper.registerModule(cDataModule); return xmlMapper; } }
3. 例外处理(可选)
如果个别字符串字段不需要CDATA包裹,可单独给该字段添加@JsonSerialize(using = StringSerializer.class)注解,覆盖全局配置,使用默认字符串序列化器:
import com.fasterxml.jackson.databind.ser.std.StringSerializer; import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class DemoEntity { // 该字段不使用CDATA @JsonSerialize(using = StringSerializer.class) private String noCdataField; // 其他字符串字段自动用CDATA private String normalField; }
内容的提问来源于stack exchange,提问作者stash
相关产品推荐
相关产品推荐

