1、问题
避免前端输入的字符串参数两端包含空格,通过统一处理的方式,trim掉空格
2、实现方式
/**
* 去除字符串类型参数的前后空格
* @author yanlei
* @since 2022-06-14
*/
@Configuration
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class StringParamTrimConfig {
@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());
}
});
}
}
说明:
@AutoConfigureAfter(WebMvcAutoConfiguration.class) : 表示该配置类在 WebMvcAutoConfiguration (Spring MVC 的自动配置类 )之后进行配置,确保在 Spring MVC 相关配置完成后再进行字符串参数处理配置,防止因依赖问题导致配置失效。
@ControllerAdvice :对所有控制器提供通用功能,@ControllerAdvice 可以与其他注解如 @ExceptionHandler、@ModelAttribute、@InitBinder 等一起使用,处理异常、共享模型数据、进行数据绑定等。这里用于统一处理字符串参数的操作。可参考https://blog.csdn.net/weixin_44594317/article/details/144723619
@InitBinder 注解的 initBinder 方法 :
- WebDataBinder 是 Spring MVC 用于数据绑定的核心类,负责将请求参数绑定到 Java 对象。
- StringTrimmerEditor 是自定义的属性编辑器,构造函数参数 false 表示当字符串为空白时,不将其转换为 null ,而是保留空字符串。
- binder.registerCustomEditor(String.class, stringTrimmerEditor) 这行代码将自定义的 StringTrimmerEditor 注册到 WebDataBinder 中,作用是在将请求参数绑定到 Java 对象时,对所有 String 类型参数自动去除前后空格 。