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

Spring Boot(Jackson 2.13.3)自定义序列化器未触发问题排查

排查Jackson自定义序列化器不生效(Null转空字符串)的问题

针对你遇到的自定义序列化器未触发、日志无输出的问题,按以下步骤逐一排查:

1. 确认序列化器的注册逻辑

自定义序列化器必须正确绑定到Jackson的ObjectMapper,分两种场景处理:

  • 全局生效:需在配置类中把序列化器注册到ObjectMapper的模块里,同时用@Primary确保覆盖Spring Boot默认配置:
@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule nullHandleModule = new SimpleModule();
        // 若要处理所有类型的Null值,用Object.class;仅处理String类型则用String.class
        nullHandleModule.addSerializer(Object.class, new NullToEmptyStringSerializer());
        mapper.registerModule(nullHandleModule);
        return mapper;
    }
}
  • 局部字段生效:必须在实体类目标字段上添加@JsonSerialize(using = NullToEmptyStringSerializer.class),且序列化器的泛型要匹配字段类型。

2. 检查序列化器的类型匹配与逻辑

确保序列化器能正确识别并处理目标类型,示例代码如下:

public class NullToEmptyStringSerializer extends JsonSerializer<Object> {
    private static final Logger log = LoggerFactory.getLogger(NullToEmptyStringSerializer.class);

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        log.info("触发Null转空字符串处理");
        gen.writeString(value == null ? "" : value.toString());
    }

    // 重写isEmpty方法,明确告知Jackson该序列化器处理Null场景
    @Override
    public boolean isEmpty(SerializerProvider provider, Object value) {
        return value == null;
    }
}

如果仅处理String类型,把泛型改为String,注册时用String.class,避免不必要的类型匹配问题。

3. 排查实体类的冲突注解

如果实体类或字段加了@JsonInclude(JsonInclude.Include.NON_NULL),Jackson会直接忽略Null字段,不会进入序列化流程,自定义序列化器自然不会触发。必须移除该注解,才能让Null字段进入序列化环节。

4. 验证日志配置是否正确

如果序列化器的日志没打印,先检查日志级别配置。比如你的日志是info级别,需在application.properties中开启对应类的info日志:

logging.level.com.yourpackage.serializer.NullToEmptyStringSerializer=info

避免因日志级别过高导致日志被过滤。

5. 更简洁的替代方案

其实Jackson内置了Null值转空字符串的配置,无需自定义序列化器:

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper mapper = builder.build();
        // 针对所有String类型的Null值,自动转为空字符串
        mapper.configOverride(String.class)
                .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
        return mapper;
    }
}

如果要处理所有类型的Null值(比如Integer、Date等转空字符串),可以直接设置全局Null值序列化器:

mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<>() {
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("");
    }
});

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:11:13