spring切面接口ResponseBodyAdvice的分析和使用
ResponseBodyAdvice接口属于springMVC 和springBoot框架基础的底层切面接口;实现这个接口的类,可以修改直接作为 ResponseBody
类型处理器的返回值,即进行功能增强。
1、有两种类型的处理器会将返回值作为ResponseBody
:
- 返回值为
HpptEntity
- 加了
@ResponseBody或@RestController
注解,
实现了这个接口的类,处理返回的json值在传递给 HttpMessageConverter
之前;应用场景在spring项目开发过程中,对controller层返回值进行修改增强处理。比如返回值5,需要封装成
{"code":"0","data":5,,"msg":"success"}格式返回前端
接口源码如下:
public interface ResponseBodyAdvice<T> {/ * **该组件是否支持给定的控制器方法返回类型*和选择的{@code HttpMessageConverter}类型。返回类型* @param converterType选择的转换器类型* @return {@code true}如果{@link #beforeBodyWrite}应该被调用;* {@code false}否则* /boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);/ * **在{@code HttpMessageConverter}被选中之后和之前调用*它的write方法被调用。* @param body要写入的主体控制器方法的返回类型:* @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);}
2、应用场景在spring项目开发过程中,对controller层返回值进行修改增强处理。比如返回值5,需要封装成 {"code":"0","data":5,,"msg":"success"} 格式返回前端
controller层业务代码:
@RestController //此注解包含@ResponseBody注解
@RequestMapping("/nandao")
public class ResponseBodyAdviceController {@RequestMapping(value = "/hello", method = RequestMethod.GET)public int hello() {//业务代码省略return 5;}}
实现ResponseBodyAdvice接口的切面类:
/**
*此注解针对controller层的类做增强功能,即对加了@RestController注解的类进行处理
*/
@ControllerAdvice(annotations = RestController.class)
public class RestResultWrapper implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {//定义一个统一的返回类RestResult responseResult = new RestResult( "0", body, "success");//如果handler处理类的返回类型是String(即控制层的返回值类型),为了保证一致性,这里需要将ResponseResult转回去if(body instanceof String) {return JSON.toJSONString(responseResult);}//封装后的数据返回到前端页面return JSONObject.toJSON(responseResult);}}
返回公共类的创建:
/*** @author nandao* Created on 2021/1/12-21:47.* 统一返回Rest风格的数据结构*/
public class RestResult<T> implements Serializable {/*** 成功的code码*/private String code = "2000";/*** 成功时返回的数据,失败时返回具体的异常信息*/private T data;/*** 请求失败返回的提示信息,给前端进行页面展示的信息*/private String message ;public RestResult() {}@Overridepublic String toString() {return "RestResult{" +"code='" + code + '\'' +", data=" + data +", message=" + message +'}';}public RestResult(String code, T data, String message) {this.code = code;this.data = data;this.message = message;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public T getData() {return data;}public void setData(T data) {this.data = data;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}
到此切面增强功能就实现了,可以直接在实战项目中使用。
spring切面接口ResponseBodyAdvice的分析和使用相关推荐
- 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
转载自 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
2019独角兽企业重金招聘Python工程师标准>>> 我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegi ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...
- Spring IOC 容器源码分析 - 余下的初始化工作
1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...
- Spring IOC 容器源码分析系列文章导读 1
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- 护网必备技能:Spring Boot 接口数据加解密 功能实现
护网必备技能:Spring Boot 接口数据加解密 功能实现 文章目录 护网必备技能:Spring Boot 接口数据加解密 功能实现 1. 尽量少改动,不影响之前的业务逻辑: 2. 考虑到时间紧迫 ...
- Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...
- Spring Developer Tools 源码分析:二、类路径监控
在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...
最新文章
- mysql半复制_mysql半同步复制
- 编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。...
- 前端学习(1310):http协议
- 一套小学生的试卷。。。
- 【OJ8756】砝码称重V2,可达性多重背包
- 期刊投稿状态_在省级期刊上发表论文可以用于评定中级职称吗?
- Numpy ndarry按行、列求和
- JDBCUtils——C3P0
- python virtualenv
- 遇到的一个很有趣的陷阱
- mysql读mdf_mdf文件如何导入MySQL数据库?
- 国际贸易术语解释通则(EXW 工厂交货…(指定地点))
- 第十二课 Java基础篇——面向对象进阶(三)
- 浅析 Hadoop 中的数据倾斜
- 使用Python和机器学习进行文本情感分类
- 基于SSM实现的水果店收银系统
- 给网页质量进行瘦身的办法-金瑞帆建站
- JAVA JDK8的介绍下载和安装(附网盘地址)
- 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!
- [Machine Learning] 方向导数梯度(Directional Derivative Gradient)
热门文章
- koa框架数据导出为excel格式
- 拼多多这样来挑选关键词|百择电商
- 【Microsoft Visual Studio 2010完成CLR窗体应用程序】计算器和画图板的设计
- python程序运行结果不停_关于python:在进程运行时不断打印Subprocess输出
- 如何查看.mdf文件数据库版本信息
- 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
- C++ 时间戳 时间相关函数
- html javascript div 加边框,html div 加边框样式
- java 重载条件
- Lightroom导入JPG格式的图像