您现在的位置是:首页 >其他 >SpringBoot-Controller入参去除前后空格网站首页其他
SpringBoot-Controller入参去除前后空格
简介SpringBoot-Controller入参去除前后空格
面临测试需求存在着用户输入的参数前后空格需要统一做去除,所以找个通用的解决方案进行统一处理。若需要处理一些特殊字符,例如%字符会穿透like查询查出所有记录的解决方案,可以参考该文,mybatis-plus支持入参%的模糊匹配查询及get请求支持特殊字符
一. 解决思路
首先我们面临两种常见的请求方式,一种是post请求的body传参,还有一种是get请求的url路径参数。
body传参使用json数据格式,所以应该需要使用序列化处理;
get请求的参数则可以使用StringTrimmerEditor进行处理。
二. 解决方法
talk is chep, show me the code.
get请求处理
需注意basePackages指定需要增强处理trim入参的包路径
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice(basePackages = {"com.vainycos"})
public class StringHttpMessageConverterAdvice {
/**
* 去除get方式的参数空格
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
// 创建 String trim 编辑器 构造方法中 boolean 参数含义为如果是空白字符串,是否转换为null 且会在setAsText中自动trim一次
StringTrimmerEditor propertyEditor = new StringTrimmerEditor(false);
// 为 String 类对象注册编辑器
binder.registerCustomEditor(String.class, propertyEditor);
}
}
post请求处理
- 继承jackson的SimpleModule进行序列化参数trim处理
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.stereotype.Component;
@Component
public class StringTrimModule extends SimpleModule {
private static final long serialVersionUID = 1L;
public StringTrimModule() {
addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {
private static final long serialVersionUID = 1L;
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
if (p == null || p.getValueAsString() == null) {
return "";
}
String value = p.getValueAsString();
return value.trim();
}
});
}
}
-
同样使用get请求的方式进行controller增强,StringHttpMessageConverterAdvice
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.util.StringUtils; import java.io.IOException; @ControllerAdvice(basePackages = {"com.vainycos"}) public class StringHttpMessageConverterAdvice { /** * 去除post requestBody实体中的空格 * @return */ @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return new Jackson2ObjectMapperBuilderCustomizer() { @Override public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { jacksonObjectMapperBuilder .deserializerByType(String.class, new StdScalarDeserializer<Object>(String.class) { @Override public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException { return StringUtils.trimWhitespace(jsonParser.getValueAsString()); } }); } }; } }
参考资料:
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。