SpringMVC : 基于 Jackson 的数据转换处理

本文聚焦SpringMVC中基于Jackson的数据转换处理,详细介绍了数据承接阶段的转换流程,包括HttpMessageConverter模块,Converter的加载和初始化,以及数据导出的过程。文章通过源码分析,展示了从AbstractJackson2HttpMessageConverter的read方法开始,如何进行Bean的解析和设置,以及数据导出时的转换处理。最后,作者提到虽然偏离了SpringMVC的核心内容,但这样的排查过程对于理解日常使用的原理非常有帮助。
摘要由CSDN通过智能技术生成

一 . 前言

这一篇只关注一个小点 , 学习一下 SpringMVC 是如何进行数据转换.

二. 数据承接

2.1 数据转换常见用法

以 fasterxml 为例 , 它属于外包 , 但是 SpringMVC 对其进行了集成 , 那么该功能是如何进行处理的呢 ?

2.2 数据转换的源码梳理

JSON 的转换流程主要为 HttpMessageConverter 模块 , 先来看一下之前的流程图

image.png

可以看到 , 会先通过 HandlerMethodArgumentResolverComposite 对属性进行解析 , 通过 HandlerMethodReturnValueHandlerComposite 对返回进行解析 , 他们都会通过 AbstractMessageConverterMethodArgumentResolver 进行统一的处理.

2.2.1 MessageConverter 的加载和初始化

// 注意 , 该类在 Spring AutoConfigure 中 , 并不是 MVC 专属
private static class MessageConverterInitializer implements Runnable {

   @Override
   public void run() {
      // 此处创建了一个对应的 FormHttpMessageConverter 扩展 ,增加对XML和基于json的部件的支持
      new AllEncompassingFormHttpMessageConverter();
   }

}

// 其中预加载了多种解析的类
public AllEncompassingFormHttpMessageConverter() {

   addPartConverter(new SourceHttpMessageConverter<>());
   
   // JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然
   if (jaxb2Present && !jackson2XmlPresent) {
      addPartConverter(new Jaxb2RootElementHttpMessageConverter());
   }
   // 处理JSON和XML格式化的类库 
   if (jackson2Present) {
      addPartConverter(new MappingJackson2HttpMessageConverter());
   }
   
   // Gson是谷歌官方推出的支持 `JSON -- Java Object` 相互转换的 Java`序列化/反序列化` 库
   else if (gsonPresent) {
      addPartConverter(new GsonHttpMessageConverter());
   }
   // 与 JSON 不同 , jsonb是保存为二进制格式的
   //- jsonb通常比json占用更多的磁盘空间(有些情况不是)
   //- jsonb比json的写入更耗时间
   //- json的操作比jsonb的操作明显更耗时间(在操作一个json类型值时需要每次都去解析)
   else if (jsonbPresent) {
      addPartConverter(new JsonbHttpMessageConverter());
   }
   // jackson 并不是值处理 JSON 的 , 这个转换器用于读写XML编码数据的扩展组件
   if (jackson2XmlPresent) {
      addPartConverter(new MappingJackson2XmlHttpMessageConverter());
   }
   // 可以读写Smile数据格式 
   if (jackson2SmilePresent) {
      addPartConverter(new MappingJackson2SmileHttpMessageConverter());
   }
}

- jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
- jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
               ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
- jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
- jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
- gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
- jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);

2.2.2 转化的入口

MessageConvert 转换的核心入口为 AbstractMessageConverterMethodArgumentResolver , 来看一下处理逻辑 (之前已经看过相关的代码 , 这里只截取一部分 -> juejin.cn/post/696584…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值