jackson默认不自动去除字符串首尾空格,需通过自定义反序列化器(@jsondeserialize)、全局module配置或@jsoncreator构造器实现trim;注意敏感字段禁用、空白字符串处理及全局替换风险。

Jackson 默认不会自动去除字符串首尾空格,需要通过自定义反序列化器或配置全局处理器来实现。
使用 @JsonDeserialize 注解 + 自定义反序列化器
适用于单个字段或特定类的 String 字段,精准控制哪些字段需要 trim。
- 编写一个继承 StdDeserializer
的反序列化器:
protected TrimStringDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String value = p.getValueAsString();
return value == null ? null : value.trim();
}
}
- 在目标字段或 getter 上添加注解:
private String username;
全局配置:注册 Module 替换默认 String 反序列化器
适用于整个应用统一处理所有 String 字段(谨慎使用,避免影响非业务场景如密码、token 等)。
- 创建模块并替换 String 类型的反序列化器:
module.addDeserializer(String.class, new StdDeserializer
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String str = p.getValueAsString();
return str == null ? null : str.trim();
}
});
ObjectMapper mapper = new ObjectMapper().registerModule(module);
使用 @JsonCreator + 构造器/静态工厂方法(推荐用于 DTO)
更可控、语义清晰,适合数据传输对象,避免副作用。
- 在 DTO 中定义带 @JsonCreator 的构造器,并对参数显式 trim:
private final String name;
@JsonCreator
public UserDTO(@JsonProperty("name") String name) {
this.name = name == null ? null : name.trim();
}
}
注意事项与建议
- 空字符串 "" 经
trim()后仍是 "",不是null;如需将纯空白字符串转为null,用StringUtils.isBlank(str) ? null : str.trim() - 敏感字段(如密码、API key)不应自动 trim,应单独处理或禁用该逻辑
- 全局替换 String 反序列化器会影响所有 String 类型(包括枚举 toString、日志字段等),务必充分测试
- Spring Boot 用户可在
@Configuration类中配置ObjectMapperBean 实现全局生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











