SpringMVC4.3 HttpMessageConverter接口实现源码分析

 更新时间:2023年09月11日 11:43:55   作者:爱吃鱼的KK  
这篇文章主要为大家介绍了SpringMVC4.3 HttpMessageConverter接口实现源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

HttpMessageConverter 概述

HttpMessageConverter 其实就是将 HttpServletRequest 中的数据, 根据 MediaType 转换成指定格式的数据, 比如我们常见的表单提交 或通过 Json字符串提交数据

主要实现接口

// 数据转换器 -> 将数据转换成 requests 或 response 中的数据
public interface HttpMessageConverter<T> {
    // 指定的 class 是否支持读取(MediaType 指数据的格式)
    boolean canRead(Class<?> clazz, MediaType mediaType);
    // 传入 class 与 MediaType -> 看 HttpMessageConverter 是否支持写数据到数据流中
    boolean canWrite(Class<?> clazz, MediaType mediaType);
    // 返回 HttpMessageConverter 支持的 MediaType
    List<MediaType> getSupportedMediaTypes();
    // 从 HttpInputMessage 中读取数据流, 并转化成 T 这站类型
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
    // 将 T 里面的数据信息写入到 HttpOutputMessage 的数据流中
    void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}

接口的实现类

对于接口的实现类主要有如下几类:

1. FormHttpMessageConverter
    支持 MultiValueMap 类型, 并且 MediaType 类型是 "multipart/form-data", 从 InputStream 里面读取数据, 并通过&符号分割, 最后转换成 MultiValueMap, 或 将 MultiValueMap转换成 & 符号连接的字符串, 最后转换成字节流, 输出到远端
2. BufferedImageHttpMessageConverter
    支持 BufferedImgae 的 HttpMessageConverter, 通过 ImageReader 将 HttpBody 里面的数据转换成 BufferedImage, 或ImageWriter 将ImageReader 转换成字节流输出到 OutputMessage
3. StringHttpMessageConverter
    支持数据是 String 类型的, 从 InputMessage 中读取指定格式的 str, 或 将数据编码成指定的格式输出到 OutputMessage
4. SourceHttpMessageConverter
    支持 DOMSource, SAXSource, StAXSource, StreamSource, Source 类型的消息转换器, 在读取的时候, 从 HttpBody 里面读取对应的数据流转换成对应对应, 输出时通过 TransformerFactory 转换成指定格式输出
5. ResourceHttpMessageConverter
    支持数据类型是 Resource 的数据, 从 HttpBody 中读取数据流转换成 InputStreamResource|ByteArrayResource, 或从 Resource 中读取数据流, 输出到远端
6. ProtobufHttpMessageConverter
    支持数据类型是 com.google.protobuf.Message, 通过 com.google.protobuf.Message.Builder 将 HttpBody 中的数据流转换成指定格式的 Message, 通过 ProtobufFormatter 将 com.google.protobuf.Message 转换成字节流输出到远端
7. ObjectToStringHttpMessageConverter
    支持 MediaType是 text/plain 类型, 从 InputMessage 读取数据转换成字符串, 通过 ConversionService 将字符串转换成自定类型的 Object; 或将 Obj 转换成 String, 最后 将 String 转换成数据流
8. ByteArrayHttpMessageConverter
    支持格式是 byte 类型, 从 InputMessage 中读取指定长度的字节流, 或将 OutputMessage 转换成字节流
9. AbstractXmlHttpMessageConverter及其子类
    支持从 xml 与 Object 之间进行数据转换的 HttpMessageConverter
10. AbstractGenericHttpMessageConverter
    支持从 Json 与 Object 之间进行数据转换的 HttpMessageConverter (PS: 主要通过 JackSon 或 Gson)
11. GsonHttpMessageConverter
    支持 application/*++json 格式的数据, 并通过 Gson, 将字符串转换成对应的数据
12. MappingJackson2XmlHttpMessageConverter
    支持 application/*++json/*+xml 格式的数据, 并通过 JackSon, 将字符串转换成对应的数据

总结

HttpMessageConverter 在整个 SpringMVC 中起着根据 MediaType 类型将 HttpServletRequest 中的数据转换成 指定对象的转换器, 或将对象转换成指定格式的数据(PS: byte/String/xml/json 等); 在其整体设计上与 HandlerMethodArgumentResolver 相似!

以上就是SpringMVC4.3 HttpMessageConverter源码分析的详细内容,更多关于SpringMVC HttpMessageConverter的资料请关注脚本之家其它相关文章!

相关文章

  • Java回调函数原理实例与代理模式的区别讲解

    Java回调函数原理实例与代理模式的区别讲解

    今天小编就为大家分享一篇关于Java回调函数原理实例与代理模式的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • java基础之标签、按钮和按钮事件简介

    java基础之标签、按钮和按钮事件简介

    本文给大家带来的是java图形界面的基础知识,简单介绍了标签、按钮和按钮事件,十分的详细,有需要的小伙伴可以参考下。
    2015-06-06
  • http调用controller方法时openfeign执行流程

    http调用controller方法时openfeign执行流程

    这篇文章主要为大家介绍了http调用controller方法时openfeign执行流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中后台线程实例解析

    Java中后台线程实例解析

    这篇文章主要介绍了Java中后台线程实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringBoot+WebSocket向前端推送消息的实现示例

    SpringBoot+WebSocket向前端推送消息的实现示例

    WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许服务器主动向客户端推送信息,同时也能从客户端接收信息,本文主要介绍了SpringBoot+WebSocket向前端推送消息的实现示例,感兴趣的可以了解一下
    2024-08-08
  • Java BigDecimal正确用法详解

    Java BigDecimal正确用法详解

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理
    2022-10-10
  • Spring Boot+Nginx实现大文件下载功能

    Spring Boot+Nginx实现大文件下载功能

    相信很多小伙伴,在日常开放中都会遇到大文件下载的情况,大文件下载方式也有很多,比如非常流行的分片下载、断点下载;当然也可以结合Nginx来实现大文件下载,在中小项目非常适合使用,这篇文章主要介绍了Spring Boot结合Nginx实现大文件下载,需要的朋友可以参考下
    2024-05-05
  • Java毕业设计实战之健身器材商城系统的实现

    Java毕业设计实战之健身器材商城系统的实现

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Jdbc+Servlet+Ajax+Fileupload+mysql实现健身器材商城系统,大家可以在过程中查缺补漏,提升水平
    2022-03-03
  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    详细分析Java中String、StringBuffer、StringBuilder类的性能

    在Java中,String类和StringBuffer类以及StringBuilder类都能用于创建字符串对象,而在分别操作这些对象时我们会发现JVM执行它们的性能并不相同,下面我们就来详细分析Java中String、StringBuffer、StringBuilder类的性能
    2016-05-05
  • spring boot 下支付宝的开箱既用环境

    spring boot 下支付宝的开箱既用环境

    这篇文章主要介绍了spring boot 下支付宝的开箱既用环境包括使用场景和使用技巧,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10

最新评论