SpringBoot请求参数去首尾空格
大约 2 分钟
提示
SpringBoot前后端分离后, 前端有时传递过来的数据可能未去空格, 后端统一处理
1. 开启@RequestParam
参数的去空格
@ControllerAdvice(basePackages = "com.test")
public class GlobalControllerExceptionHandler implements WebBindingInitializer {
@InitBinder
@Override
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); // 开启参数去空格
}
}
2. 开启@RequestBody
中json数据的去空格
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE) //必须设置排序高
public class WebConfiguration implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder; // 加载默认的jackson配置
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 添加序列号,反序列化的工具类
ObjectMapper objectMapper = jackson2ObjectMapperBuilder
.serializers(new StringTrimSerializer())
.deserializers(new StringTrimDeserializer()).build();
converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
}
}
3. 序列化,反序列化json代码
@SuppressWarnings("serial")
@JacksonStdImpl
public final class StringTrimSerializer
// NOTE: generic parameter changed from String to Object in 2.6, to avoid
// use of bridge methods
// In 2.9, removed use of intermediate type `NonTypedScalarSerializerBase`
extends StdScalarSerializer<Object> {
private static final long serialVersionUID = 1L;
public StringTrimSerializer() {
super(String.class, false);
}
@Override
public boolean isEmpty(SerializerProvider prov, Object value) {
String str = StringUtils.trim((String) value);
return str.length() == 0;
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(StringUtils.trim((String) value)); //序列化也要trim
}
@Override
public final void serializeWithType(Object value, JsonGenerator gen, SerializerProvider provider,
TypeSerializer typeSer) throws IOException {
// no type info, just regular serialization
gen.writeString(StringUtils.trim((String) value));
}
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint) {
return createSchemaNode("string", true);
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException {
visitStringFormat(visitor, typeHint);
}
}
@JacksonStdImpl
public class StringTrimDeserializer extends StdScalarDeserializer<String> // non-final since 2.9
{
private static final long serialVersionUID = 1L;
/**
* @since 2.2
*/
public final static StringTrimDeserializer instance = new StringTrimDeserializer();
public StringTrimDeserializer() { super(String.class); }
// since 2.6, slightly faster lookups for this very common type
@Override
public boolean isCachable() { return true; }
@Override // since 2.9
public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException {
return "";
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
return StringUtils.trim(defaultDeserialize(p, ctxt)); // 反列化后, trim
}
private String defaultDeserialize(JsonParser p, DeserializationContext ctxt) throws IOException{
if (p.hasToken(JsonToken.VALUE_STRING)) {
return p.getText();
}
JsonToken t = p.getCurrentToken();
// [databind#381]
if (t == JsonToken.START_ARRAY) {
return _deserializeFromArray(p, ctxt);
}
// need to gracefully handle byte[] data, as base64
if (t == JsonToken.VALUE_EMBEDDED_OBJECT) {
Object ob = p.getEmbeddedObject();
if (ob == null) {
return null;
}
if (ob instanceof byte[]) {
return ctxt.getBase64Variant().encode((byte[]) ob, false);
}
// otherwise, try conversion using toString()...
return ob.toString();
}
// allow coercions for other scalar types
// 17-Jan-2018, tatu: Related to [databind#1853] avoid FIELD_NAME by ensuring it's
// "real" scalar
if (t.isScalarValue()) {
String text = p.getValueAsString();
if (text != null) {
return text;
}
}
return (String) ctxt.handleUnexpectedToken(_valueClass, p);
}
// Since we can never have type info ("natural type"; String, Boolean, Integer, Double):
// (is it an error to even call this version?)
@Override
public String deserializeWithType(JsonParser p, DeserializationContext ctxt,
TypeDeserializer typeDeserializer) throws IOException {
return deserialize(p, ctxt);
}
}