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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:43:12