Spring Boot:定制HTTP消息转换器

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

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

消息转换器的位置

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

How Do

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

  1. 在WebConfiguration类中加入@Bean定义
    @Beanpublic ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
     return new ByteArrayHttpMessageConverter();
    }
  2. 重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;
    @Overridepublic
    void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
     converters.add(new ByteArrayHttpMessageConverter());
    }
  3. 更多的控制,可以重写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实例也可以重写这个方法,但是这种几率非常小。

时间: 2024-08-07 17:38:11

Spring Boot:定制HTTP消息转换器的相关文章

Spring Boot 定制URL匹配规则的方法

事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后来发现这是Spring Boot路由规则.好了,有废话了下,那么看看我们解决上面这个导致的问题. 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符".",这种情况在Spring中可以称之为"定界符定义的格式&q

Spring Boot:定制PropertyEditors

在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据,实际上,在一次请求的完成过程中还发生了其他的转换,我们这次关注将参数转换成多种类型的对象,如:字符串转换成Date对象或字符串转换成Integer对象. 在编写控制器中的action方法时,Spring允许我们使用具体的数据类型定义函数签名,这是通过PropertyEditor实现的.PropertyEditor本来是JDK提供的API,用于将文本值转换成给定的类型,结果Spring的

《Spring Boot Cookbook》阅读笔记

声明1:该系列教程已经在极客学院上线:spring-boot cookbook 声明2:本博客文章需征得作者同意后方可转载 作为后端开发,Spring Boot值得拥有 从技术雷达 : 关于技术趋势的分析报告和Profile of successful Java developer in 2016这两篇文章中都可以看出,作为Java开发人员,Spring Boot已经成为你不得不尽快补充的一项技能. 最近一个月一直在学习Spring Boot框架,在阅读<Spring Boot Cookbook

Spring Data JPA方法定义规范【从零开始学Spring Boot】

视频&交流平台] à SpringBoot网易云课堂视频 http://study.163.com/course/introduction.htm?courseId=1004329008 à Spring Boot交流平台 http://412887952-qq-com.iteye.com/blog/2321532           事情的起因:有人问过我们这个这个问题:为什么我利用Spring data jpa写的方法没有按照我想要的情况进行执行呢?我记得当时只是告诉他你你先看看Spring

《Spring Boot官方指南》(二)入门(二)

3.2.5 命令行补全工具 Spring Boot CLI附带了一些脚本,这些脚本为BASH 和zsh提供了命令行补全功能.在任何shell里面都可以source到这些脚本(也叫spring),也可以初始化到个人或者系统级别的命令行工具里面.在Debian系统里面,系统级别的脚本在这个路径:/shell-completion/bash,shell程序启动以后,这里面的所有脚本都可以执行.例如,您已经使用SDKMAN!安装了这些脚本,为了手动执行他们,可以这样操作: $ . ~/.sdkman/c

Spring Boot:定制static path mappings

在Spring Boot:定制URL匹配规则一文中我们展示了如何调整URL请求匹配到对应的控制器方法的规则.类似得,也可以控制应用程序对静态文件(前提是被打包进部署包)的处理. 假设我们需要通过URLhttp://localhost:8080/internal/application.properties对外暴露当前程序的配置. How Do 在WebConfiguration类中添加相应的配置,代码如下: @Overridepublic void addResourceHandlers(Res

Spring Boot:定制自己的starter

在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务--使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boot自动通过classpath路径下的类发现需要的Bean,并织入bean.举个例子,spring-boot-starter-jdbc这个starter的存在,使得我们只需要在BookPubApplication下用@Autowired引入DataSource的bean就可以,Spring Boot会

Spring Boot:定制servlet filters

在实际的web应用程序中,经常需要在请求(request)外面增加包装用于:记录调用日志.排除有XSS威胁的字符.执行权限验证等等.除了上述提到的之外,Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们在自己的项目中还可以增加别的过滤器. Spring Boot.Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bea

Spring Boot:定制拦截器

Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供HandlerInterceptor(拦截器)工具.根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前.request被响应之后.视图渲染之前以及request全部结束之后.我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行. Sprin