Spring中能否自定义注解实现DTO接收JSON请求时去除字符串空格?
实现JSON转DTO时自动去除字符串空格的方案
一、自定义@TrimWhitespace注解实现
完全可以通过自定义注解结合Jackson的反序列化机制实现需求,步骤如下:
1. 定义@TrimWhitespace注解
该注解用于标记需要处理的字段,并指定对应的反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @JsonDeserialize(using = TrimWhitespaceDeserializer.class) public @interface TrimWhitespace { }
2. 实现自定义反序列化器
编写字符串反序列化器,负责去除字符串前后空格:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; public class TrimWhitespaceDeserializer extends StdDeserializer<String> { public TrimWhitespaceDeserializer() { super(String.class); } @Override public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException { String value = jsonParser.getText(); return value == null ? null : value.trim(); } }
3. 在DTO中使用注解
按照你期望的方式,直接在需要处理的字段上添加注解即可:
public class TestDTO { @TrimWhitespace private String name; // 其他字段、getter/setter方法 }
当Jackson将JSON请求映射到该DTO时,会自动对标记了@TrimWhitespace的字段执行去空格操作。
二、其他便捷处理方式
如果不想自定义注解,还有以下几种方案可选:
1. 全局配置Jackson实现全量字符串去空格
若需要对所有DTO的字符串字段统一去空格,可以全局配置Jackson的ObjectMapper,注册自定义反序列化器:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; public class JacksonGlobalConfig { public static ObjectMapper getTrimmedObjectMapper() { ObjectMapper mapper = new ObjectMapper(); SimpleModule trimModule = new SimpleModule(); trimModule.addDeserializer(String.class, new TrimWhitespaceDeserializer()); mapper.registerModule(trimModule); return mapper; } }
在Spring Boot项目中,还可以通过配置类将该ObjectMapper注入容器,实现全局生效:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @Configuration public class JacksonTrimConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); SimpleModule trimModule = new SimpleModule(); trimModule.addDeserializer(String.class, new TrimWhitespaceDeserializer()); mapper.registerModule(trimModule); return mapper; } }
2. 在DTO的Setter方法中手动处理
针对个别字段的需求,可以直接在Setter方法中调用去空格逻辑,比如借助Apache Commons Lang工具类:
public class TestDTO { private String name; public void setName(String name) { this.name = org.apache.commons.lang3.StringUtils.trim(name); } // getter方法 }
这种方式无需依赖Jackson扩展,逻辑直观但字段较多时会比较繁琐。
内容的提问来源于stack exchange,提问作者javadeveloper2
相关产品推荐
相关产品推荐

