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

