您现在的位置是:首页 >其他 >SpringBoot-Controller入参去除前后空格网站首页其他

SpringBoot-Controller入参去除前后空格

Vainycos 2024-06-12 18:01:02
简介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());
                            }
                        });
                }
            };
        }
    }
    
    
    

参考资料:

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。