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

