SpringBoot去除字符串类型参数的前后空格

在实际的开发过程中,经常会使用String类型的参数,而用户提交给后端的字符串可以说五花八门:""," “,” 123456","123456 “,”  123456 " 等等。如果不对这些空格进行处理,不仅会浪费存储空间,还会引起一些不必要的麻烦。

接收String类型的参数通常两种方式:

①.使用url或者form表单的形式
对于这种情况,我们在参数绑定时注册下面的类即可:

@RestControllerAdvice
public class GlobalHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalHandler.class);

    /**
     *  url和form表单中的参数trim
     *
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 构造方法中 boolean 参数含义为如果是空白字符串, 是否转换为 null
        // 即如果为 true, 那么 "" 会被转换为 null, 否者为""
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}

②.接收Request BodyJSONXML对象参数
Spring MVC默认使用 Jackson 对参数进行反序列化,所以对Jackson加入如下自定义转换器即可:

@Configuration
public class ApplicationConfig {

    /**
     * Request Body中JSON或XML对象参数trim
     *
     * @return
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            // 时区问题
            jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
            jacksonObjectMapperBuilder.deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {
                @Override
                public String deserialize(JsonParser jsonParser, DeserializationContext ctx)
                        throws IOException {
                    // 去除前后空格
                    return StringUtils.trimWhitespace(jsonParser.getValueAsString());
                }
            });
        };
    }
}
优化

对于这种所有项目都需要的通用配置,我们应该抽取一个公共模块,然后通过引入依赖来实现自动配置

common模块下创建自动配置类 WebMvcStringTrimAutoConfiguration

package com.zzs.common.autoconfigure;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.Servlet;
import java.io.IOException;

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class WebMvcStringTrimAutoConfiguration {

    @ControllerAdvice
    public static class ControllerStringParamTrimConfig {

        /**
         * url和form表单中的参数trim
         */
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            // 构造方法中 boolean 参数含义为如果是空白字符串,是否转换为null
            // 即如果为true,那么 " " 会被转换为 null,否者为 ""
            StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(false);
            binder.registerCustomEditor(String.class, stringTrimmerEditor);
        }
    }

    /**
     * Request Body中JSON或XML对象参数trim
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
                .deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {
                    @Override
                    public String deserialize(JsonParser jsonParser, DeserializationContext ctx)
                            throws IOException {
                        return StringUtils.trimWhitespace(jsonParser.getValueAsString());
                    }
                });
    }
}

然后在 resurces 创建 META-INF/spring.factories 文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zzs.common.autoconfigure.WebMvcStringTrimAutoConfiguration
### Spring Boot 中非空校验注解及其用法 在 Spring Boot 应用中,可以使用 Bean Validation 提供的标准注解来实现字段的非空校验。以下是常用的三种非空校验注解以及它们的具体含义和用法: #### 常见非空校验注解 1. **`@NotNull`** - 表示该字段不能为空对象(即不能为 `null`),但允许为空字符串 (`""`) 或其他类型的默认值。 - 示例代码如下: ```java @NotNull(message = "名称不能为空") private String name; ``` 2. **`@NotEmpty`** - 不仅要求字段不为 `null`,还要求其长度大于零(对于集合、数组或字符串)。 - 示例代码如下: ```java @NotEmpty(message = "列表不能为空") private List<String> items; ``` 3. **`@NotBlank`** - 主要针对字符串类型,表示字段既不能为 `null`,也不能是空白字符(如空格)。它会自动去除首尾空格后再判断是否有效。 - 示例代码如下: ```java @NotBlank(message = "描述不能为空") private String description; ``` #### 使用方法 为了使这些注解生效,在控制器层的方法参数上需要加上 `@Valid` 注解[^1]。如果缺少此注解,则即使定义了校验规则也不会触发验证逻辑。 另外需要注意的是,某些高版本的 Spring Boot 可能存在兼容性问题,因此建议开发者确认所使用的依赖库版本是否匹配当前项目需求[^2]。 ```java @RestController public class ExampleController { @PostMapping("/example") public ResponseEntity<?> createExample(@RequestBody @Valid ExampleRequest request) { return ResponseEntity.ok("Success"); } } ``` 以上展示了如何在一个 RESTful 接口中启用请求体的数据校验功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值