学透Spring Boot — 017. 魔术师—Http消息转换器

详解Spring自定义消息格式转换器及底层源码分析 在配置消息转换器时,指明了当前这个消息转换器能够接收的内容类型,也就是客户端请求时需要设定Content-Type为application/fm。AbstractMessageConverterMethodArgumentResolver的如下方法:​​​​​​​关于write的相关方法和read差不多,也就是判断能否write,然后调用对应的writeInternal方法。因为上一步已经得到了解析器。继续就会进入到read方法,真正读取处理消息内容的代码了。进行入选中的方法,这个方法最终会进入父类。 阅读详情

本文是我的专栏《学透Spring Boot》的第17篇文章,了解更多请移步我的专栏:

学透 Spring Boot_postnull咖啡的博客-优快云博客

目录

HTTP请求和响应

需求—新的Media Type

实现—新的Media Type

定义转换器

注册转换器

编写Controller

测试新的mediatype

Http消息转换器实现原理

总结


HTTP请求和响应

很多接口,我们发起HTTP请求,请求参数是json。得到的响应也是json。

但是我们的控制器中,是使用Java对象来接收请求,出参也是Java对象。

而不是JSONObject。

这样的好处是更好操作,不用再次把Json对象转换成Java对象。

这是怎么做到的呢?

是不是和上一篇的Spring MVC Conversion Service 类型转换 一样的原理呢?

是,但不完全是。

需求—新的Media Type

先来实现一个需求,看看能不能实现。

我们希望我们的请求是这样

和普通的请求不太一样,主要有亮点:

  1. 我们的MediaType是自己定义“hehe/nba”
  2. 我们的数据体是自己构造的文本,用###分割字段

一般情况,没人会自定定义媒体类型,用得最多的是xml和json。

我们这里这么做,是为了理解json消息体是怎么解析的。

实现—新的Media Type

定义转换器

首先我们先定义一个新Http消息转换器。

它继承的是HttpMessageConverter接口。

注意这里实现的是HttpMessageConverter接口,和我们上一篇文章的类型转换器不一样,它实现的是Converter接口。

public class CarHttpConverter implements HttpMessageConverter<Car> {
    private static final String SPLITCHAR = "###";
    private static final String MY_MEDIA_TYPE1 = "hehe/nba;charset=UTF-8";
    private static final String MY_MEDIA_TYPE2 = "hehe/nba";

    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        if(mediaType == null){
            return true;
        }
        return clazz == Car.class
                && (mediaType.equals(MediaType.valueOf(MY_MEDIA_TYPE1)) || mediaType.equals(MediaType.valueOf(MY_MEDIA_TYPE2)));
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        if(mediaType == null){
            return true;
        }
        return clazz == Car.class
                && (mediaType.equals(MediaType.valueOf(MY_MEDIA_TYPE1)) || mediaType.equals(MediaType.valueOf(MY_MEDIA_TYPE2)));
    }

    @Override
    public List<MediaType> getSupportedMediaTypes() {
        return List.of(MediaType.valueOf(MY_MEDIA_TYPE1), MediaType.valueOf(MY_MEDIA_TYPE2));
    }

    @Override
    public Car read(Class<? extends Car> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        // 从输入流中读取 CSV 数据并将其转换为 Book 对象
        InputStreamReader reader = new InputStreamReader(inputMessage.getBody());
        StringBuilder csvData = new StringBuilder();
        int character;
        while ((character = reader.read()) != -1) {
            csvData.append((char) character);
        }
        String[] fields = csvData.toString().split(SPLITCHAR);
        String type = fields[0];
        double price = Double.parseDouble(fields[1]);
        String year = fields[2];

        return Car.builder().type(type).price(price).year(year).build();
    }

    @Override
    public void write(Car car, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody());
        String csvData = car.getType() + SPLITCHAR + car.getPrice() + SPLITCHAR + car.getYear();
        writer.write(csvData);
        writer.flush();
    }
}

注册转换器

然后,注册这个Http消息转换器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new CarHttpConverter());
    }
}

编写Controller

特别注意,我们这里的consum和produce用的media type是我们自定义的type。

consumes 指定接收HTTP请求的mediaytpe

produces 指定发送HTTP响应的mediatype

@RestController
@Log
public class HttpMsgController {
    @PostMapping(path = "/buyCar", consumes = "hehe/nba", produces = "hehe/nba")
    public Car buyCar(@RequestBody Car car){
        car.setYear("2025");
        return car;
    }
}

测试新的mediatype

设置content type。hehe/nba是我们自定义的type。

设置request body,我们的内容是用###做分隔符的。

这是我们约定的格式。

大功告成!

我们没有使用json,但是定了一个一种新的序列化格式!!!hehe/nba!

Http消息转换器实现原理

我们可以debug看看消息转换器注册的代码。

converters列表中包含了我们新定义的转换器,还包括了Jackson的消息转换器。

我们再看看Spring Boot是如何自动配置Jackson的。

找到Spring Boot的配置类列表

怎么定位这个文件,请参考我之前的文章。

列表中包含了Spring MVC的自动配置WebMvcAutoConfiguration

大部分的默认配置在WebMvcConfigurationSupport。

可以看到,当我们的classpath下,有jackson的包,就会自动使用Jackson处理requestbody和response body.

总结

本文我们定义了一个新的content type, 构造新的请求体和响应体。希望通过本文,你对Http 消息转换器有更多的了解。

道岔故障监测系统设计(源码+开题) 通过实时监控道岔的工作状态,系统能够及时发现异常情况,预防潜在的安全隐患,从而减少事故发生的概率。此外,监测系统还能够为维护人员提供详细的数据支持,帮助他们更准确地判断道岔的磨损程度和故障类型,优化维修计划,延长道岔的使用寿命。随着智能化、自动化技术的发展,道岔故障监测系统的设计与应用也将推动铁路行业的技术进步,为实现智能铁路和未来交通系统的构建奠定基础。因此,开展道岔故障监测系统的设计研究,不仅具有重要的工程实践价值,也有助于推动铁路运输行业向更高水平的发展。 阅读详情

相关推荐

STM32CUBEMX 使用教程5 — DMA配置 & 串口结合DMA实现数据搬运

DMA(Direct Memory Access),直接存储器访问(或数据搬运),是STM32中很实用的一个外设。DMA 传输数据方式不需要 CPU 参与控制传输,也不用中断处理的方式进行数据搬运处理,纯粹通过硬件为 RAM 与 I/O 设备之间开辟一条直接传送数据的通路,使 CPU 的效率大大提高。

weixin_43866583的博客 1499

springboot-方法处理4-消息转换器

本文介绍消息转换器HttpMessageConverter;

zhouping118的博客 3332

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 633

Spring MVC 消息转换器

同样,当控制器方法返回响应时,Spring MVC会根据客户端请求的Accept头部信息,查找适合的消息转换器将Java对象转换成响应消息的数据格式。当客户端(例如浏览器)向服务器发送请求时,服务器需要将请求消息转换成服务器应用程序可以理解的形式,同样当服务器向客户端发送响应时,服务器应用程序需要将响应消息转换成客户端可以理解的形式。消息转换器是Spring MVC框架中的一种功能强大的机制,它可以将HTTP请求和响应中的消息体与Java对象之间进行转换。

ylsace的博客 2269

HALCON深度学习模型部署新选择:一份详细的OpenVINO 2021.4 LTS集成与配置避坑指南

本文详细介绍了如何将HALCON深度学习模型与OpenVINO 2021.4 LTS集成,提供环境配置、硬件加速优化及故障排除的实用指南。特别针对Intel独立显卡的AI加速器接口进行优化,帮助机器视觉工程师提升AI推理效率,适用于工业检测等高要求场景。

weixin_42531779的博客 238

Xilinx的DDR4 IP

Xilinx的DDR4 IP

weixin_39896700的博客 4456

SpringBoot配置消息转换器

首先明白,因为是基于SpringBoot进行配置,所以配置都是基于配置类进行配置,配置消息转换器是在WebMvcConfigure接口实现类中重写configureMessageConverters、或者是重写extendMessageConverters方法,具体这两个方法有什么不同,我在下面会进行说明下面是一个相对简单的配置,如果有其它需求的,需要配置其它序列化特性的,我下面进行简单说明。

m0_63445035的博客 4596

微信小程序 - 解决请求报错 request:fail errcode:-201 cronet_error_code:-201 error_msg:net::ERR_CERT_DATE_INVALID

微信小程序报错“request:fail errcode:-201 cronet_error_code:-201 error_msg:net::ERR_CERT_DATE_INVALID“,微信小程序请求报错,微信小程序errcode:-201,服务器报错,无法调用接口,微信小程序真机https请求失败,微信小程序wx.request接口报错,小程序真机调试运行接口都报错了,真机测试下网络请求都不行了且报错,证书没问题依旧报错,检查HTTPS证书,ssl证书,使用浏览器测试访问证书是正常的,不是证书问题,请

🏆 前端领域优质创作者 1万+

HttpMessageConverter 消息转换器

HttpMessageConverter 是SpringMVC中提供的一个策略接口,它是一个消息转换器类,Spring Mvc中就是由HttpMessageConverter负责转换HTTP的请求和响应。默认情况下,Spring Boot 会自动加载如下消息类型转换器:StringHttpMessageConverter:负责读取字符串格式的数据和写出二进制格式的数据(当返回值是或者接受值是String类型时,是由这个处理)

Huangjiazhen711的博客 7150

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 87

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

本文记录的是基于 GhostNetV3 的 RT-DETR轻量化改进方法研究。GhostNetV3的轻量模块采用方法,训练时为深度可分离卷积和1×1卷积添加,推理时通过移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现RT-DETR的轻量化改进。

Limiiiing的博客 970

RabbitMQ入门指南(六):消息转换器及其案例

RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ默认转换器、JSON转换器及其案例等内容。

Rye的博客 2611

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9833

学透Spring Boot — 018. 优雅支持多种响应格式

本文,我们自己通过内容协商,实现了返回多种格式响应的需求,而且不用改动任何业务代码,只需做少量配置即可。另外,我们也通过引入XML的依赖,实现了Spring Boot对Jackson XML的自动配置。

postnull的博客 1257

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HttpMessageConverter(消息转换器)

HttpMessageConverter

囚徒之困 2752

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SpringBoot中MessageConverter消息转换器以及内容协商等原理分析

本文内容包括SpringBoot中MessageConverter消息转换器底层原理分析、ReturnValueHandler返回值处理器原理分析、内容协商原理分析分析以及自定义MessageConverter消息转换器和自定义内容协商管理器的方法

weixin_64709241的博客 5808

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SpringMVC系列-5 消息转换器

SpringMVC系列的第五篇介绍消息转换器,本文讨论的消息转换指代调用Controller接口后,对结果进行转换处理的过程。 内容包括介绍自定义消息转换器、SpringMVC常见的消息转换器、Spring消息转换器工作原理等三部分。

shengyu 4382

SpringMVC 报文信息转换器(HttpMessageConverter)

(2)在SpringMVC的核心配置文件中开启mvc的注解驱动,此时在HandlerAdaptor中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,可以将响应到浏览器的Java对象转换为Json格式的字符串。RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息。(1)导入jackson的依赖。

淼淼不暴躁! 619

springboot 自定义消息转换器

首先我们继承AbstractHttpMessageConverter来实现一个自己的消息转换器。 然后将自定义的消息转换器加入到springmvc容器中,以便被使用。

秃头的博客 1557

SpringMVC的消息转换器

SpringMVC的消息转换器

m0_50742275的博客 2033

消息转换器在SpringMVC执行流程

消息转换器

m0_50742275的博客 1056

五、消息转换器

采用 JSON 序列化代替默认的 JDK 序列化

天行健,君子以自强不息 377

Spring MVC消息转换器的扩展使用

在实现用户编辑功能时,需要获取特定用户的ID,并根据该ID对用户信息进行修改。但测试中,没有报错,但是功能并没有实现。

zhanglei1147的博客 1349

Spring MVC 源码剖析(五)—— 消息转换器 HttpMessageConverter 万字详解

摘要:HttpMessageConverter是Spring MVC中实现HTTP消息转换的核心接口,负责请求/响应的序列化与反序列化。文章详细解析了其工作原理,包括接口定义、内置实现(如JSON/XML/文本转换器)、内容协商机制以及注册配置方法。重点探讨了转换器的工作流程、性能优化策略(对象池化、缓存)以及常见问题解决方案(中文乱码、日期格式、大文件处理)。通过自定义转换器示例展示了扩展能力,为构建高效RESTful API提供了关键技术指导。

油墨香^-^的博客 1011

java 消息转换器

注解转换和消息转换器

懒洋洋的博客 383

消息转换器

消息转换器     AmqpTemplate同样定义了一些发送和接收消息的方法,这些方法委托MessageConverter来完成。MessageConverter自身很直观,它为每个方向都提供了一个方法:一个是转为Message,一个是从Message转出为。注意当转为Message的时候除了实体,你还需要提供一些附加属性,‘objects'一般情况下对应着消息体。 public i

sn_gis的专栏 4496
上一篇: 学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
下一篇: 学透Spring Boot — 017. 处理静态文件
postnull咖啡
博客等级 码龄10年 1026粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值