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请求处理

  1. 继承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();
            }
        });
    }
}
  1. 同样使用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());
                            }
                        });
                }
            };
        }
    }
    
    
    

参考资料:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值