Spring Boot 中如何统一 API 接口响应格式?

今天又要给大家介绍一个 Spring Boot 中的组件
--HandlerMethodReturnValueHandler 。
在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何对请求/响应数据进行预处理/二次处理,当时我们使用了 ResponseBodyAdvice 和 RequestBodyAdvice 。其中 ResponseBodyAdvice 可以实现对响应数据的二次处理,可以在这里对响应数据进行加密/包装等等操作 。不过这不是唯一的方案,今天松哥要和大家介绍一种更加灵活的方案--HandlerMethodReturnValueHandler,我们一起来看看下 。
1.HandlerMethodReturnValueHandlerHandlerMethodReturnValueHandler 的作用是对处理器的处理结果再进行一次二次加工,这个接口里边有两个方法:
public interface HandlerMethodReturnValueHandler { boolean supportsReturnType(MethodParameter returnType); void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,   ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;}

  • supportsReturnType:这个处理器是否支持相应的返回值类型 。
  • handleReturnValue:对方法返回值进行处理 。
HandlerMethodReturnValueHandler 有很多默认的实现类,我们来看下:
Spring Boot 中如何统一 API 接口响应格式?

文章插图
 
接下来我们来把这些实现类的作用捋一捋:
ViewNameMethodReturnValueHandler
这个处理器用来处理返回值为 void 和 String 的情况 。如果返回值为 void,则不做任何处理 。如果返回值为 String,则将 String 设置给 mavContainer 的 viewName 属性,同时判断这个 String 是不是重定向的 String,如果是,则设置 mavContainer 的 redirectModelScenario 属性为 true,这是处理器返回重定向视图的标志 。
ViewMethodReturnValueHandler
这个处理器用来处理返回值为 View 的情况 。如果返回值为 View,则将 View 设置给 mavContainer 的 view 属性,同时判断这个 View 是不是重定向的 View,如果是,则设置 mavContainer 的 redirectModelScenario 属性为 true,这是处理器返回重定向视图的标志 。
MapMethodProcessor
这个处理器用来处理返回值类型为 Map 的情况,具体的处理方案就是将 map 添加到 mavContainer 的 model 属性中 。
StreamingResponseBodyReturnValueHandler
这个用来处理 StreamingResponseBody 或者 ResponseEntity<StreamingResponseBody> 类型的返回值 。
DeferredResultMethodReturnValueHandler
这个用来处理 DeferredResult、ListenableFuture 以及 CompletionStage 类型的返回值,用于异步请求 。
CallableMethodReturnValueHandler
处理 Callable 类型的返回值,也是用于异步请求 。
HttpHeadersReturnValueHandler
这个用来处理 HttpHeaders 类型的返回值,具体处理方式就是将 mavContainer 中的 requestHandled 属性设置为 true,该属性是请求是否已经处理完成的标志(如果处理完了,就到此为止,后面不会再去找视图了),然后将 HttpHeaders 添加到响应头中 。
ModelMethodProcessor
这个用来处理返回值类型为 Model 的情况,具体的处理方式就是将 Model 添加到 mavContainer 的 model 上 。
ModelAttributeMethodProcessor
这个用来处理添加了 @ModelAttribute 注解的返回值类型,如果 annotaionNotRequired 属性为 true,也可以用来处理其他非通用类型的返回值 。
ServletModelAttributeMethodProcessor
同上,该类只是修改了参数解析方式 。
ResponseBodyEmitterReturnValueHandler
这个用来处理返回值类型为 ResponseBodyEmitter 的情况 。
ModelAndViewMethodReturnValueHandler
这个用来处理返回值类型为 ModelAndView 的情况,将返回值中的 Model 和 View 分别设置到 mavContainer 的相应属性上去 。
ModelAndViewResolverMethodReturnValueHandler
这个的 supportsReturnType 方法返回 true,即可以处理所有类型的返回值,这个一般放在最后兜底 。
AbstractMessageConverterMethodProcessor
这是一个抽象类,当返回值需要通过 HttpMessageConverter 进行转化的时候会用到它的子类 。这个抽象类主要是定义了一些工具方法 。
RequestResponseBodyMethodProcessor
这个用来处理添加了 @ResponseBody 注解的返回值类型 。
HttpEntityMethodProcessor
这个用来处理返回值类型是 HttpEntity 并且不是 RequestEntity 的情况 。
AsyncHandlerMethodReturnValueHandler
这是一个空接口,暂未发现典型使用场景 。
【Spring Boot 中如何统一 API 接口响应格式?】


推荐阅读