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

Spring Boot 3.0.0升级后Elasticsearch Jackson Mapper污染Spring配置问题

解决Spring Boot 3.0 + Spring Data Elasticsearch中Jackson全局序列化配置被覆盖的问题

你遇到的问题根源在于新版本Elastic Java Client的JacksonJsonpMapper会强制修改传入的ObjectMapper序列化规则,把serialization-inclusion设为NON_NULL,直接覆盖了Spring Boot的全局Jackson配置。下面是两种可行的解决办法:

方法一:复用Spring Boot配置好的ObjectMapper创建自定义JacksonJsonpMapper

创建一个配置类,注入Spring容器中已经应用了全局配置的ObjectMapper,基于它创建Elastic的JsonpMapper,不覆盖序列化包含规则:

import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticsearchConfig {

    @Bean
    public JacksonJsonpMapper jacksonJsonpMapper(ObjectMapper objectMapper) {
        // 仅保留Elastic需要的INDENT_OUTPUT配置,不修改序列化包含规则
        return new JacksonJsonpMapper(
            objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false)
        );
    }
}

这样Elastic的Mapper就会继承Spring Boot全局配置的default-property-inclusion: always,不会再强制设置为NON_NULL。

方法二:手动指定Elastic Mapper的序列化规则

如果需要单独为Elastic的序列化设置规则(和全局配置区分开),可以复制Spring的ObjectMapper后手动调整:

import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticsearchConfig {

    @Bean
    public JacksonJsonpMapper jacksonJsonpMapper(ObjectMapper objectMapper) {
        ObjectMapper elasticCustomMapper = objectMapper.copy();
        elasticCustomMapper.configure(SerializationFeature.INDENT_OUTPUT, false);
        // 手动设置你需要的序列化包含规则,比如ALWAYS
        elasticCustomMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        return new JacksonJsonpMapper(elasticCustomMapper);
    }
}

原理:默认的JacksonJsonpMapper构造器会在传入ObjectMapper后,强制调用setSerializationInclusion(NON_NULL)覆盖原有配置。通过自定义这个Bean,我们可以接管ObjectMapper的配置过程,确保保留需要的序列化行为。

内容的提问来源于stack exchange,提问作者Sebastian A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07