springMVC参数解析和fastjson自定义序列化反序列化的采坑之路

前言:之前前端往后端传递数据的时候使用的是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;

FastJson的使用文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值