我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringMVC HttpMessageConverter消息转换器怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringMVC HttpMessageConverter消息转换器怎么使用

今天小编给大家分享一下SpringMVC HttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    Spring MVC 为开发者提供了方便的开发方式和丰富的功能。其中,HttpMessageConverter 是Spring MVC中非常重要的一个组件,它负责将客户端提交的请求数据(如JSON、XML等)转换为Java对象,同时也负责将 Java 对象转换为客户端需要的数据格式。

    作用

    在 Spring MVC 中,客户端通过发送请求,向服务器端请求数据,服务器端接收到请求后需要将请求参数转换为 Java 对象进行处理,这就需要使用 HttpMessageConverter,它主要负责将HTTP请求中的请求参数转换为 Java 对象或将 Java 对象转换为 HTTP 响应中的内容。

    HttpMessageConverter 是一个接口,Spring MVC 中有很多实现类,用于处理不同的数据类型。常见的 HttpMessageConverter 实现类有:

    • ByteArrayHttpMessageConverter:用于处理字节数组类型的数据。

    • StringHttpMessageConverter:用于处理字符串类型的数据。

    • FormHttpMessageConverter:用于处理表单类型的数据。

    • MappingJackson2HttpMessageConverter:用于处理JSON类型的数据。

    • Jaxb2RootElementHttpMessageConverter:用于处理XML类型的数据。

    HttpMessageConverter 接口定义了两个方法:canRead() 和 canWrite(),分别用于判断当前的 HttpMessageConverter 是否可以读取或写入指定的数据类型。

    • 如果 canRead() 方法返回 true,那么当前的 HttpMessageConverter 就可以将 HTTP 请求中的请求参数转换为 Java 对象;

    • 如果 canWrite() 方法返回 true,那么当前的 HttpMessageConverter 就可以将Java对象转换为 HTTP 响应中的内容。

    源码实现

    下面以 MappingJackson2HttpMessageConverter 为例,讲解 HttpMessageConverter 的源码实现。

    MappingJackson2HttpMessageConverter 是一个用于处理 JSON 类型数据的 HttpMessageConverter 实现类。它继承了 AbstractJackson2HttpMessageConverter 类,并实现了 HttpMessageConverter 接口。

    canRead()

    @Overridepublic boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) {    JavaType javaType = getJavaType(clazz, null);    return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType));}

    方法首先调用了 getJavaType() 方法获取 JavaType 对象

    然后判断当前的 ObjectMapper 是否可以反序列化 JavaType 对象。

    如果当前的 HttpMessageConverter 可以反序列化 JavaType 对象并且当前的 MediaType 可以被处理,那么就返回 true,否则返回 false。

    canWrite()

    @Overridepublic boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {    return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType));}

    方法首先判断当前的 ObjectMapper 是否可以序列化指定的 Java 对象

    如果可以序列化并且当前的 MediaType 可以被处理,那么就返回 true,否则返回 false。

    read()

    @Overridepublic T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {    JavaType javaType = getJavaType(clazz, null);    try {        return this.objectMapper.readValue(inputMessage.getBody(), javaType);    }    catch (JsonProcessingException ex) {        throw new HttpMessageNotReadableException("JSON parse error: " + ex.getMessage(), ex, inputMessage);    }}

    方法首先调用 getJavaType() 方法获取 JavaType 对象

    然后通过 ObjectMapper 的 readValue() 方法将HTTP请求中的请求参数转换为 Java 对象。

    如果在转换的过程中出现了异常,那么就抛出 HttpMessageNotReadableException 异常。

    write()

    @Overrideprotected void writeInternal(T t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {    try {        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());        JsonGenerator jsonGenerator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding);        writePrefix(jsonGenerator, t);        this.objectMapper.writeValue(jsonGenerator, t);        writeSuffix(jsonGenerator, t);        jsonGenerator.flush();    }    catch (JsonProcessingException ex) {        throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);    }}

    方法首先通过 getJsonEncoding() 方法获取JSON编码格式

    然后通过 ObjectMapper 的 writeValue() 方法将 Java 对象转换为 JSON 格式的字符串

    并将结果输出到 HTTP 响应中。如果在转换的过程中出现了异常,那么就抛出 HttpMessageNotWritableException 异常。

    异同

    大家是不是觉得与前面文章所讲的 MethodArgumentResolver 很相似,都能够将请求参数转换为Java对象,但它们的作用和处理流程不同:

    • HttpMessageConverter 会在请求到达 Controller 方法之前进行处理,这意味着它只处理请求参数,而不管 Controller 方法的签名和参数类型;

    • MethodArgumentResolver 会在 Controller 方法执行之前进行处理,它的作用是将请求参数按照 Controller 方法的参数顺序进行解析,并将解析结果映射到 Controller 方法的参数上,然后再调用 Controller 方法

    以上就是“SpringMVC HttpMessageConverter消息转换器怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    SpringMVC HttpMessageConverter消息转换器怎么使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    SpringMVC HttpMessageConverter消息转换器怎么使用

    今天小编给大家分享一下SpringMVC HttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面
    2023-07-06

    SpringMVC之消息转换器HttpMessageConverter

    这篇文章主要介绍SpringMVC之消息转换器HttpMessageConverter,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!摘要SpringMVC使用消息转换器实现请求报文和对象、对象和响应报文之间的自动转换
    2023-05-30

    SpringMVC HttpMessageConverter报文信息转换器怎么使用

    这篇“SpringMVC HttpMessageConverter报文信息转换器怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
    2023-06-30

    SpringMVC中如何使用消息转换器HttpMessageConverter与@ResponseBody注解

    小编给大家分享一下SpringMVC中如何使用消息转换器HttpMessageConverter与@ResponseBody注解,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去
    2023-06-02

    SpringBoot HttpMessageConverter消息转换器如何使用

    本篇内容介绍了“SpringBoot HttpMessageConverter消息转换器如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
    2023-07-02

    怎么使用spring的消息转换器

    这篇文章给大家介绍怎么使用spring的消息转换器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体内容如下//domainpackage com.crazy.goods.tools;/** * 0755-351512
    2023-05-31

    RabbitMQ消息转换器怎么应用

    本文小编为大家详细介绍“RabbitMQ消息转换器怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“RabbitMQ消息转换器怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在SpringAMQP的发
    2023-07-05

    详解自定义SpringMVC的Http信息转换器的使用

    在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制。使用系统默认配置的HttpMessageConverter进行解析,然后
    2023-05-30

    JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js、css这些静态文件的加载配置,以及服务器推送的两种实现方式。当然我们在服务器推送时,会用到jQuery的东西,所以我们先聊一下如何加载静态资源文件,然后我们再聊如何实现服
    2023-05-31

    Linux消息队列怎么使用

    在Linux中,消息队列是一种进程间通信的机制,用于在不同进程之间传递数据。下面是使用Linux消息队列的步骤:包含头文件:#include #include #include 定义消息队列的键值:key_t key = ftok(
    2023-10-22

    node消息队列怎么使用

    这篇文章主要介绍“node消息队列怎么使用”,在日常操作中,相信很多人在node消息队列怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node消息队列怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来
    2023-07-05

    怎么使用redis消息队列

    要使用Redis作为消息队列,你需要按照以下步骤进行操作:1. 安装并启动Redis服务。2. 在你的应用程序中引入Redis的客户端库,如redis-py(Python)、Jedis(Java)、StackExchange.Redis(C
    2023-08-24

    SpringMVC拦截器怎么使用

    今天小编给大家分享一下SpringMVC拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。SpringMVC 的拦
    2023-07-05

    Android怎么使用广播发送消息

    本文小编为大家详细介绍“Android怎么使用广播发送消息”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么使用广播发送消息”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体效果如下1.activ
    2023-06-30

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录