SpringBoot2.x 将前端空字符请求参数转为null

1、起因

前后端分离后,部分前端会将没有value值的参数直接传给后台。
如参数有key但是没有value,转成json后变为:{"key":""}
由此和后端产生歧义!如果后端不做空字符串转换为null可能造成sql查询异常

2、解决

解决方案一 (推荐): 让前端在发起请求前过滤掉空参,避免后端因为处理参数问题造成未知的bug
解决方案二:SpringBoot2 配置Jackson 参数过滤器(仅适用实体类型的对象参数)
1.继承 StdDeserializer 重写字符串并行化函数deserialize
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
/**
 * @Author yj
 * @Date  2020/11/4
 **/
public class StringWithoutSpaceDeserializer extends StdDeserializer<String> {

    private static final long serialVersionUID = -6972065572263950443L;

    public StringWithoutSpaceDeserializer(Class<String> vc) {
        super(vc);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        if(StringUtils.isBlank(p.getText())){
            return null;
        }
        return p.getText().trim();
    }
}
2.实现mvc过滤器 (需要同时格式化日期参数)
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.text.SimpleDateFormat;
import java.util.List;

/**
 * 前端参数过器配置(空串和空格反序列化)
 * @Author yj
 * @Date  2020/11/4
 **/
@Configuration
public class WebMvcSerializationConfig implements WebMvcConfigurer {

	@Override
	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		converters.add(mappingJackson2HttpMessageConverter());
	}

	@Bean
	public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		ObjectMapper mapper = new ObjectMapper();
		//格式化前端日期为 yyyy-MM-dd HH:mm:ss 可选
		mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		SimpleModule module = new SimpleModule();
		module.addDeserializer(String.class, new StringWithoutSpaceDeserializer(String.class));
		mapper.registerModule(module);

		converter.setObjectMapper(mapper);

		return converter;
	}
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值