• SpringMVC中对HttpMessageConverter的理解


    HttpMessageConverter流程简图:

    FastJsonHttpMessageConverter类对Json报文的转换
    @Configuration
    public class JsonConfig {
        public JsonConfig(){}
        @Bean
        public HttpMessageConverters fastJsonHttpMessageConverter(){
            //1、创建FastJson信息转换对象
            FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
            //2、创建FastJsonConfig对象并设定序列化规则  序列化规则详见SerializerFeature类中,后面会讲
            FastJsonConfig fastJsonConfig= new FastJsonConfig();
    fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,SerializerFeature.WriteNonStringKeyAsString);
    //本人就坑在WriteNonStringKeyAsString 将不是String类型的key转换成String类型,否则前台无法将Json字符串转换成Json对象
    
            //3、中文乱码解决方案
            List<MediaType> fastMedisTypes = new ArrayList<MediaType>();
            //设定Json格式且编码为utf-8
            fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
            fastConverter.setSupportedMediaTypes(fastMedisTypes);
            //4、将转换规则应用于转换对象
            fastConverter.setFastJsonConfig(fastJsonConfig);
            return new HttpMessageConverters(fastConverter);
    
        }
    }

    序列化规则

            QuoteFieldNames,//输出key时是否使用双引号,默认为true 
    
            UseSingleQuotes,//使用单引号而不是双引号,默认为false
    
            WriteMapNullValue,//是否输出值为null的字段,默认为false 
    
            WriteEnumUsingToString,//Enum输出name()或者original,默认为false
    
            UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false
    
            WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null 
    
            WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null 
         
            WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null 
    
            WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null
    
            SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
    
            SortField,//按字段名称排序后输出。默认为false
    
            @Deprecated
            WriteTabAsSpecial,//把	做转义输出,默认为false
    
            PrettyFormat,//结果是否格式化,默认为false
    
            WriteClassName,//序列化时写入类型信息,默认为false。反序列化是需用到
    
            DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false
    
            WriteSlashAsSpecial,//对斜杠'/'进行转义
    
            BrowserCompatible,//将中文都会序列化为uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
    
            WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    
            NotWriteRootClassName,//暂不知,求告知
    
            DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false 
    
            BeanToArray; //暂不知,求告知

    @RequestBody
    作用: 

          i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

          ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

    使用时机:

    A) GET、POST方式提时, 根据request header Content-Type的值来判断:

        application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
        multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
        其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

    B) PUT方式提交时, 根据request header Content-Type的值来判断:

        application/x-www-form-urlencoded, 必须;
        multipart/form-data, 不能处理;
        其他格式, 必须;
    说明:request的body部分的数据编码格式由header部分的Content-Type指定;

    @ResponseBody

    作用: 

          该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

    使用时机:

          返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

    HttpMessageConverter类
    ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
    StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;
    ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 
    FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
    MappingJacksonHttpMessageConverter:  负责读取和写入json格式的数据;
    SouceHttpMessageConverter:          负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
    Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;
    AtomFeedHttpMessageConverter:              负责读取和写入Atom格式的数据;
    RssChannelHttpMessageConverter:           负责读取和写入RSS格式的数据;

    也可以自定义HttpMessageConverter,通过继承AbstractHttpMessageConverter类。

  • 相关阅读:
    读《豆瓣的基础架构》有感
    读《【解密】京东B2B业务架构演变》有感
    soa
    读《京东咚咚架构演进》有感
    读《游戏服务器的架构演进(完整版)》有感
    读《京东物流系统架构演进中的最佳实践》有感
    读《微博众筹的架构设计》有感
    读《新浪微博如何应对极端峰值下的弹性扩容挑战》有感
    读《微博推荐架构的演进》有感
    读《新浪微博用户兴趣建模系统架构》有感
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12661666.html
Copyright © 2020-2023  润新知