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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:54:56