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类。