前言:之前前端往后端传递数据的时候使用的是ajax+FormData对象,没有注意到Content-Type的问题,服务器使用SpringMVC,Controller直接使用一个model直接接收,也没有加什么注解,今天提到一个新的需求,将传递的数据该成json格式的。既然要该成json格式的,Content-Type的值就也需要修改成application\json。好了前端修改完了,测试的时候发现了问题,因为服务器开启了validate,要进行表单验证,验证全部不通过。一查发现Model的所有属性全部都为null,难怪不过。
为什么全部都为空了?因为springMVC解析不了json格式的参数,需要加上Json这种格式的HttpMessageConvert(我这里加的就是fastjson)和@RequestBody注解,所以加上之后就好了。
又出现了一个想法,为什么之前的FormData传递数据SpringMVC能接受呢?观察表单才发现,使用FormData对象传递的属性将表单Content-Type变成了multipart/form-data,而springMvc能解析这种参数,然后将其放置在了request中,所以我们之前不加任何注解的时候controller默认的参数解析器能正确的解析到参数,但是json格式就不一样了。
又出现了一个新的问题,我们的bean对象中存在一个boolean类型属性,前端传递的参数是一个字符串类型的数据“on”,fastjson又罢工了,他解析不了这玩意,不能将“on”转换到Boolean,之前SpringMVC也转换不了,添加了一个Convert就行了,那Fastjson该怎么加?
public class BooleanDeserializer implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser defaultJSONParser, Type type, Object fieldName) {
// 从json串中解析出当前属性的值,解析出来的对象是一个字符串类型
final Object parse = defaultJSONParser.parse(fieldName);
if (parse == null) {
return (T) Boolean.valueOf(false);
}
if ("on".equals(parse) || "true".equals(parse)) {
return (T) Boolean.valueOf(true);
} else {
return (T) Boolean.valueOf(false);
}
}
@Override
public int getFastMatchToken() {
return 0;
}
}
// 在要进行反序列化的属性上加上Fastjson的注解,指定该注解的反序列化自定义的类
@JSONField(deserializeUsing = BooleanDeserializer.class)
private Boolean remembered;