当前位置: 首页 > news >正文

41、响应处理-【源码分析】-自定义MessageConverter

41、响应处理源码分析自定义MessageConverter

以下是关于“响应处理-【源码分析】-自定义MessageConverter”的讲解:

#### 自定义MessageConverter的作用

- **实现多协议数据兼容**:Spring MVC默认支持JSON、XML等格式的数据转换,通过自定义`MessageConverter`,可以支持自定义的数据格式,如`application/x-guigu`等。

- **优化数据传输**:自定义格式可能更紧凑,减少数据传输量,提高传输效率。

#### 自定义MessageConverter的实现步骤

1. **创建自定义MessageConverter类**

   - 实现`HttpMessageConverter`接口,指定转换的数据类型,如`Person`类。

   - 实现`canRead()`和`canWrite()`方法,判断是否支持读取和写入指定类型和媒体类型的数据。

   - 实现`getSupportedMediaTypes()`方法,返回支持的媒体类型列表。

   - 实现`read()`和`write()`方法,分别处理数据的读取和写入逻辑。

   ```java

   public class GuiguMessageConverter implements HttpMessageConverter<Person> {

   

       // 判断是否支持读取指定类型和媒体类型的数据

       @Override

       public boolean canRead(Class<?> clazz, MediaType mediaType) {

           return false; // 不支持读取

       }

   

       // 判断是否支持写入指定类型和媒体类型的数据

       @Override

       public boolean canWrite(Class<?> clazz, MediaType mediaType) {

           return clazz.isAssignableFrom(Person.class); // 支持写入Person类型

       }

   

       // 获取支持的媒体类型

       @Override

       public List<MediaType> getSupportedMediaTypes() {

           return MediaType.parseMediaTypes("application/x-guigu"); // 支持自定义媒体类型

       }

   

       // 读取数据(本例未实现)

       @Override

       public Person read(Class<? extends Person> clazz, HttpInputMessage inputMessage)

           throws IOException, HttpMessageNotReadableException {

           return null;

       }

   

       // 写入数据

       @Override

       public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage)

           throws IOException, HttpMessageNotWritableException {

           String data = person.getUserName() + ";" + person.getAge() + ";" + person.getBirth();

           OutputStream body = outputMessage.getBody();

           body.write(data.getBytes());

       }

   }

   ```

2. **注册自定义MessageConverter**

   - 通过实现`WebMvcConfigurer`接口,在`extendMessageConverters()`方法中添加自定义的`MessageConverter`。

   ```java

   @Configuration

   public class WebConfig implements WebMvcConfigurer {

   

       @Override

       public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

           converters.add(new GuiguMessageConverter());

       }

   }

   ```

#### 内容协商原理

1. **获取客户端可接受的媒体类型**

   - 从请求头的`Accept`字段获取客户端可接受的媒体类型列表,并按权重排序。

2. **获取支持当前返回值类型的MessageConverter所支持的媒体类型**

   - 遍历所有注册的`MessageConverter`,找出支持当前返回值类型的`MessageConverter`。

   - 获取这些`MessageConverter`支持的媒体类型列表。

3. **最佳匹配媒体类型**

   - 对客户端可接受的媒体类型和支持的媒体类型进行匹配,筛选出双方都支持的媒体类型。

   - 按权重排序,选择优先级最高的媒体类型作为最终选定的媒体类型。

4. **使用匹配的MessageConverter处理响应**

   - 遍历所有`MessageConverter`,找到支持将当前返回值类型转换为选定媒体类型的`MessageConverter`。

   - 调用该`MessageConverter`的`write()`方法,将返回值写入响应体。

#### 示例

假设有一个控制器方法,返回`Person`对象:

```java

@RestController

public class ResponseTestController {

   

   @GetMapping("/person")

   public Person getPerson() {

       Person person = new Person("张三", 20, new Date());

       return person;

   }

}

```

当客户端发送请求时,如果`Accept`头包含`application/x-guigu`,则会使用`GuiguMessageConverter`将`Person`对象转换为自定义格式的数据返回给客户端。

#### 总结

通过自定义`MessageConverter`,可以实现对自定义数据格式的支持,满足特定的业务需求。内容协商机制则确保了客户端和服务器之间能够以双方都支持的媒体类型进行数据交换,提高了系统的灵活性和兼容性。

http://www.xdnf.cn/news/874657.html

相关文章:

  • [C]深入解析条件式日志宏的设计原理
  • Deepfashion2 数据集使用笔记
  • 2025年五一数学建模竞赛A题-支路车流量推测问题详细建模与源代码编写(一)
  • 洛谷 单源最短路径 Dijkstra算法+优先队列
  • 点云数据去噪(Point Cloud Processing Toolbox)
  • C++——智能指针 shared_ptr
  • 小黑黑日常积累:dataclass的简单使用
  • AtCoder解析大全
  • 在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
  • 基于 qiankun + vite + vue3 构建微前端应用实践
  • 长参考帧LTR
  • 前端八股之JS的原型链
  • 20-项目部署(Docker)
  • 【人工智能】大模型的创造力:从训练到应用的灵感火花
  • 如何配置deepseek + ida-pro-mcp
  • 让AI看见世界:MCP协议与服务器的工作原理
  • [AI Claude] 软件测试2
  • JS利用原型链实现继承
  • Spring 中的disposableBean介绍
  • C语言数据结构笔记2:结构体地址的遍历_结构体嵌套
  • Java DLL依赖缺失解决思路和修复过程(Windows版本)
  • JVM 内存结构 详解
  • 【Java】CopyOnWriteArrayList
  • 使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
  • 陈伟霆电视剧《九门》开机 续写传奇热血新篇
  • 【博客X】缤果串口蓝牙网络USB调试助手(总汇)
  • python打卡day44
  • 如何通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式(并进行了训练、推理)
  • SQL 中 IN 和 EXISTS 的区别
  • 局部变量-线程安全