zoukankan      html  css  js  c++  java
  • 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类。

  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12661666.html
Copyright © 2011-2022 走看看