Spring MVC 切面 ResponseBodyAdvice 对返回值增强
目录
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 对返回值增强相关推荐
- Spring MVC全局异常后返回JSON异常数据
Spring MVC全局异常后返回JSON异常数据 参考文章: (1)Spring MVC全局异常后返回JSON异常数据 (2)https://www.cnblogs.com/exmyth/p/560 ...
- Spring MVC控制层的返回类型--String类型与Bean类型
SpringMVC控制层的返回类型形式多样,现拿其中的两种--String类型与Bean类型作以说明. 一.测试项目的结构 说明:(jsp的名字没起好) 控制层:UserController.java ...
- .NET MVC中controler层返回值常见类型
所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Index() ...
- Asp.net mvc中Controller的返回值
(1)EmptyResult:当用户有误操作或者是图片防盗链的时候,这个EmptyResult就可以派上用场,返回它可以让用户啥也看不到内容,通过访问浏览器端的源代码,发现是一个空内容: public ...
- ajax modelmap,spring mvc+ajax处理JSON返回前台的方法
在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...
- .net mvc controler有哪些返回值
public class MyController : Controller { // 必须返回ActionResult类型 public ActionResult Hell ...
- spring + spring mvc + tomcat 面试题(史上最全)下篇
场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...
- Spring、Spring MVC、Spring boot、Spring Cloud面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
最全面试题,精心整理100家互联网企业面经,祝你面试成功.面试必过(2023优化版)已发布在个人微信公众号[面向Offer学编程],优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结, ...
- Spring MVC面试题
目录 概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC的优点 核心组件 Spring MVC的主要组件? 什么是DispatcherServlet 什 ...
- 【面试】Spring MVC面试题
概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离 ...
最新文章
- 软件seqtk的使用
- 【 MATLAB 】impz函数介绍(数字滤波器的脉冲响应)
- 解决PhpStorm卡顿的问题
- ExtJS学习笔记3:载入、提交和验证表单
- 你还能再“二”一些吗?
- [20170603]12c Top Frequency histogram.txt
- fasync驱动异步通知机制
- 鸿蒙os2.0公测机型,鸿蒙OS2.0第二期第三期公测机型陆续公布 麒麟980和麒麟820将登场...
- 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑
- linux升级了npm怎么还原,linux下升级npm以及node
- python unittest 框架添加测试用例及运行
- 在 Emacs 里修改现有文件的编码格式(转载)
- Android --- GreenDao的实现(ORM框架)
- php 递归函数 示例,php 递归函数用法示例
- 计算机后台处理程序,小编教你处理打印后台程序服务没有运行
- 斐讯k2修改dns服务器,斐讯k2路由器怎么重置?_斐讯k2恢复出厂设置教程-192路由网...
- 分形植物的c语言源代码,C语言源代码实例.rar
- 392高校毕业设计选题
- tc7102路由器虚拟服务器,国内电信推首款WiFi 6+路由器TC7102,5G和WiFi 6成黄金搭档-贤集网...
- Python数据可视化,Pyecharts库,外圆环内饼图制作
热门文章
- eclipse关闭mysql数据库_Eclipse 连接 Mysql 数据库操作总结
- 拓端tecdat|R语言贝叶斯Poisson泊松-正态分布模型分析职业足球比赛进球数
- 拓端tecdat|使用GIS制作静态地图和处理地理数据
- linux c 宏 文件名,C语言标准宏获取文件名、行号、函数名的方法以及#和##的用法...
- JSP教程第5讲笔记
- 8、饼图(ax.pie)
- docker挂载目录
- pyqtSignal信号和槽
- pytorch模型初始化
- 如何应对训练的神经网络不工作?