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

Jackson 默认不会自动去除字符串首尾空格,需要通过自定义反序列化器或配置全局处理器来实现。
使用 @JsonDeserialize 注解 + 自定义反序列化器
适用于单个字段或特定类的 String 字段,精准控制哪些字段需要 trim。
- 编写一个继承 StdDeserializer<String> 的反序列化器:
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 等)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 创建模块并替换 String 类型的反序列化器:
module.addDeserializer(String.class, new StdDeserializer<String>(String.class) {
@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)
更可控、语义清晰,适合数据传输对象,避免副作用。
立即学习“Java免费学习笔记(深入)”;
- 在 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 实现全局生效

















