目录

ResponseBodyAdvice 接口概述

ResponseBodyAdvice 快速使用

ResponseBodyAdvice 注意事项


ResponseBodyAdvice 接口概述

1、ResponseBodyAdvice 接口允许在执行 @ResponseBody 或 ResponseEntity 控制器方法之后,但在使用 HttpMessageConverter 写入响应体之前自定义响应,进行功能增强。通常用于 加密,签名,统一数据格式等。

2、ResponseBodyAdvice 接口一共有两个方法:

public interface ResponseBodyAdvice<T> {/*** 1、选择是否执行 beforeBodyWrite 方法,返回 true 执行,false 不执行.* 2、通过 supports 方法,可以选择对哪些类或方法的 Response 进行处理,其余的
则不处理。* @param returnType:返回类型* @param converterType:转换器* @return :返回 true 则下面的 beforeBodyWrite  执行,否则不执行* /boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);/*** 对 Response 处理的具体执行方法* @param body:响应对象(response)中的响应体* @param returnType:控制器方法的返回类型* @param selectedContentType:通过内容协商选择的内容类型* @param selectedConverterType:选择写入响应的转换器类型* @param request:当前请求* @param response:当前响应* @return :返回传入的主体或修改过的(可能是新的)主体* /@NullableT beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response);}

ResponseBodyAdvice 快速使用

1、使用方式:自定义类实现 ResponseBodyAdvice  接口,然后在类上标记 @ControllerAdvice 或@RestControllerAdvice 注解即可自动识别并进行功能增强。

2、下面以对返回数据封装统一格式为例进行演示(注意仅对返回值为 ResponseEntity 或者是有@ResponseBody 注解的控制器方法进行拦截,@RestController 相当于是类中的所有方法上都加了 @ResponseBody)。

3、注意如果控制层目标方法往外抛出了异常,则不再进入 ResponseBodyAdvice

/*** 对返回数据增强,封装成统一格式* 1、ResponseBodyAdvice 需要绑定到 {@link @RestControllerAdvice} 或者 {@link @ControllerAdvice} 才能生效。* 2、注意仅对返回值为 ResponseEntity 或者是有 @ResponseBody 注解的控制器方法进行拦截,* * @RestController 标记的类,相当于是类中的所有方法上都加了 @ResponseBody。* 3、@RestControllerAdvice 默认是针对所有的控制器,但也可以指定某个包,及其子包都会进行拦截。** @author wangMaoXiong* @version 1.0* @date 2022/4/16 14:31*/
@RestControllerAdvice(basePackages = "com.wmx")
public class CommonResultAdvice implements ResponseBodyAdvice<Object> {/*** 1、当且仅当本方法返回 true 时,下面的 beforeBodyWrite 方法才会执行。* 2、可以直接返回 true,此时全部经过下面的 beforeBodyWrite 方法。如下演示的是自己包下面的控制器方法返回时才进行增强。** @param returnType:返回类型* @param converterType:转换器* @return*/@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {/*** Class<?> getDeclaringClass() :返回声明基础方法或构造函数的类,比如 com.wmx.wmxredis.properties.PropertiesController*/return returnType.getDeclaringClass().getName().contains("com.wmx");}/*** 对返回的数据统一组装成 {@link ResultData} 格式** @param body:响应对象(response)中的响应体* @param returnType:控制器方法的返回类型* @param selectedContentType:通过内容协商选择的内容类型* @param selectedConverterType:选择写入响应的转换器类型* @param request:当前请求* @param response:当前响应* @return :返回传入的主体或修改过的(可能是新的)主体*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return body instanceof ResultData ? body : new ResultData(ResultCode.SUCCESS, body);}
}

/CommonResultAdvice.java· 汪少棠/wmx-redis - Gitee.com

/PropertiesController.java · 汪少棠/wmx-redis - Gitee.com

/ResultData.java · 汪少棠/wmx-redis - Gitee.com

ResponseBodyAdvice 注意事项

1、ResponseBodyAdvice 切面执行与否要看最终返回的响应:当且仅当返回值为 ResponseEntity 的方法,或者是有@ResponseBody 注解的方法才进行拦截。@RestController 相当于是类中的所有方法上都加了 @ResponseBody。

2、假如目标控制层方法往外抛出了异常,此时如果没有使用 @ControllerAdvice + @ExceptionHandler 或者 @RestControllerAdvice + @ExceptionHandler 进行全局统一异常处理,则不再继续执行 ResponseBodyAdvice 切面,因为它已经不满足第一点的条件。

3、假如目标控制层方法往外抛出了异常,并使用 @ControllerAdvice + @ExceptionHandler 进行全局统一异常处理,此时如果异常处理方法没有继续往外抛异常,且捕获方法使用了 @ResponseBody 注解或者返回的是 ResponseEntity ,则仍然会继续执行 ResponseBodyAdvice 切面,否则比如做页面跳转等操作时则不再继续执行。

4、假如目标控制层方法往外抛出了异常,并使用 @RestControllerAdvice + @ExceptionHandler 进行全局统一异常处理,只要捕获方法没有往外继续抛异常,则仍然会继续执行 ResponseBodyAdvice 切面,因为 @RestControllerAdvice 注解包含了 @ResponseBody 注解。

Spring MVC 切面 ResponseBodyAdvice 对返回值增强相关推荐

  1. Spring MVC全局异常后返回JSON异常数据

    Spring MVC全局异常后返回JSON异常数据 参考文章: (1)Spring MVC全局异常后返回JSON异常数据 (2)https://www.cnblogs.com/exmyth/p/560 ...

  2. Spring MVC控制层的返回类型--String类型与Bean类型

    SpringMVC控制层的返回类型形式多样,现拿其中的两种--String类型与Bean类型作以说明. 一.测试项目的结构 说明:(jsp的名字没起好) 控制层:UserController.java ...

  3. .NET MVC中controler层返回值常见类型

    所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Index() ...

  4. Asp.net mvc中Controller的返回值

    (1)EmptyResult:当用户有误操作或者是图片防盗链的时候,这个EmptyResult就可以派上用场,返回它可以让用户啥也看不到内容,通过访问浏览器端的源代码,发现是一个空内容: public ...

  5. ajax modelmap,spring mvc+ajax处理JSON返回前台的方法

    在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...

  6. .net mvc controler有哪些返回值

    public class MyController : Controller   {      // 必须返回ActionResult类型       public ActionResult Hell ...

  7. spring + spring mvc + tomcat 面试题(史上最全)下篇

    场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...

  8. Spring、Spring MVC、Spring boot、Spring Cloud面试题(史上最全面试题,精心整理100家互联网企业,面试必过)

    最全面试题,精心整理100家互联网企业面经,祝你面试成功.面试必过(2023优化版)已发布在个人微信公众号[面向Offer学编程],优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结, ...

  9. Spring MVC面试题

    目录 概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC的优点 核心组件 Spring MVC的主要组件? 什么是DispatcherServlet 什 ...

  10. 【面试】Spring MVC面试题

    概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离 ...

最新文章

  1. 软件seqtk的使用
  2. 【 MATLAB 】impz函数介绍(数字滤波器的脉冲响应)
  3. 解决PhpStorm卡顿的问题
  4. ExtJS学习笔记3:载入、提交和验证表单
  5. 你还能再“二”一些吗?
  6. [20170603]12c Top Frequency histogram.txt
  7. fasync驱动异步通知机制
  8. 鸿蒙os2.0公测机型,鸿蒙OS2.0第二期第三期公测机型陆续公布 麒麟980和麒麟820将登场...
  9. 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑
  10. linux升级了npm怎么还原,linux下升级npm以及node
  11. python unittest 框架添加测试用例及运行
  12. 在 Emacs 里修改现有文件的编码格式(转载)
  13. Android --- GreenDao的实现(ORM框架)
  14. php 递归函数 示例,php 递归函数用法示例
  15. 计算机后台处理程序,小编教你处理打印后台程序服务没有运行
  16. 斐讯k2修改dns服务器,斐讯k2路由器怎么重置?_斐讯k2恢复出厂设置教程-192路由网...
  17. 分形植物的c语言源代码,C语言源代码实例.rar
  18. 392高校毕业设计选题
  19. tc7102路由器虚拟服务器,国内电信推首款WiFi 6+路由器TC7102,5G和WiFi 6成黄金搭档-贤集网...
  20. Python数据可视化,Pyecharts库,外圆环内饼图制作

热门文章

  1. eclipse关闭mysql数据库_Eclipse 连接 Mysql 数据库操作总结
  2. 拓端tecdat|R语言贝叶斯Poisson泊松-正态分布模型分析职业足球比赛进球数
  3. 拓端tecdat|使用GIS制作静态地图和处理地理数据
  4. linux c 宏 文件名,C语言标准宏获取文件名、行号、函数名的方法以及#和##的用法...
  5. JSP教程第5讲笔记
  6. 8、饼图(ax.pie)
  7. docker挂载目录
  8. pyqtSignal信号和槽
  9. pytorch模型初始化
  10. 如何应对训练的神经网络不工作?