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;
}
}