详解Spring Boot 定制HTTP消息转换器

作者:杜琪 时间:2023-11-24 20:20:51 

在构建RESTful数据服务过程中,我们定义了controller、repositories,并用一些注解修饰它们,但是到现在为止我们还没执行过对象的转换——将java实体对象转换成HTTP的数据输出流。Spring Boot底层通过HttpMessageConverters依靠Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和需要的内容类型选择最适合的转换器使用。

在SpringMVC源码剖析之消息转换器HttpMessageConverter一文中,有一张图可以很清楚得表示消息转换器的位置。

详解Spring Boot 定制HTTP消息转换器

消息转换器的位置

消息转换器的目标是:HTTP输入请求格式向Java对象的转换;Java对象向HTTP输出请求的转换。有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的两者兼备。例如:MappingJackson2HttpMessageConverter可以将Java对象转换为application/json,而ProtobufHttpMessageConverter仅支持com.google.protobuf.Message类型的输入,但是可以输出application/json、application/xml、text/plain和application/x-protobuf这么多格式。

How Do

在项目中有三种办法配置消息转换器,主要区别是可定制性和易用度的衡量。

在WebConfiguration类中加入@Bean定义


@Beanpublic ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
 return new ByteArrayHttpMessageConverter();
}

重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;


@Overridepublic
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 converters.add(new ByteArrayHttpMessageConverter());
}

更多的控制,可以重写extendMessageConverters方法,首先清空转换器列表,再加入自定义的转换器。


@Overridepublic
void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
 converters.clear();
 converters.add(new ByteArrayHttpMessageConverter());
}

分析

Spring提供了多种方法完成同样的任务,选择哪个取决于我们更侧重便捷性还是更侧重可定制性。

上述提到的三种方法各有什么不同呢?

通过@Bean定义HttpMessageConverter是向项目中添加消息转换器最简便的办法,这类似于之前提到的添加Servlet Filters。如果Spring扫描到HttpMessageConverter类型的bean,就会将它自动添加到调用链中。推荐让项目中的WebConfiguration继承自WebMvcConfigurerAdapter。

通过重写configureMessageConverters方法添加自定义的转换器很方便,但有一个弱点:如果项目中存在多个WebMvcConfigurers的实例(我们自己定义的,或者Spring Boot默认提供的),不能确保重写后的configureMessageConverters方法按照固定顺序执行。

如果需要更精细的控制:清除其他消息转换器或者清楚重复的转换器,可以通过重写extendMessageConverters完成,仍然有这种可能:别的WebMvcConfigurer实例也可以重写这个方法,但是这种几率非常小。

来源:http://www.jianshu.com/p/ffe56d9553fd

标签:Spring,Boot,消息转换器
0
投稿

猜你喜欢

  • C# Dynamic关键字之:dynamic为什么比反射快的详解

    2021-06-24 04:22:35
  • Android编程之滑动按钮事件实例详解

    2022-03-20 23:03:13
  • Android中判断网络连接是否可用及监控网络状态

    2022-09-07 05:24:25
  • Java分形绘制山脉模型

    2023-05-10 00:51:29
  • 基于swing实现窗体拖拽和拉伸

    2023-11-12 22:32:40
  • Android编程应用风格和主题详解

    2022-12-31 08:26:51
  • 深入探讨Java多线程中的volatile变量

    2023-08-31 02:32:18
  • mybatis foreach遍历LIST读到数据为null的问题

    2021-05-24 20:15:27
  • Flutter中http请求抓包的完美解决方案

    2023-08-22 18:47:47
  • jenkins+Maven从SVN上构建项目的方法

    2022-07-09 04:42:37
  • C# DataTable与Model互转的示例代码

    2022-02-07 19:37:44
  • SpringBoot 整合 Shiro 密码登录的实现代码

    2023-11-10 11:27:59
  • Java switch使用原理及实例解析

    2023-10-11 20:44:20
  • Android开发高级组件之自动完成文本框(AutoCompleteTextView)用法示例【附源码下载】

    2021-09-14 08:23:54
  • C#环形队列的实现方法详解

    2021-06-04 00:38:37
  • Java内存溢出案例模拟和原理分析过程

    2023-04-09 07:27:48
  • C#函数out多个返回值问题

    2022-11-14 21:58:55
  • 学习Java设计模式之观察者模式

    2023-07-03 05:17:46
  • java自动生成编号的实现(格式:yyMM+四位流水号)

    2023-10-10 09:24:36
  • IntelliJ IDEA2020.1版本更新pom文件自动导包的方法

    2023-01-13 17:44:01
  • asp之家 软件编程 m.aspxhome.com