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的分析和使用相关推荐

  1. 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析

    转载自  接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...

  2. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegi ...

  3. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  4. Spring IOC 容器源码分析 - 余下的初始化工作

    1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...

  5. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  6. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  7. 护网必备技能:Spring Boot 接口数据加解密 功能实现

    护网必备技能:Spring Boot 接口数据加解密 功能实现 文章目录 护网必备技能:Spring Boot 接口数据加解密 功能实现 1. 尽量少改动,不影响之前的业务逻辑: 2. 考虑到时间紧迫 ...

  8. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  9. Spring Developer Tools 源码分析:二、类路径监控

    在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...

最新文章

  1. mysql半复制_mysql半同步复制
  2. 编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。...
  3. 前端学习(1310):http协议
  4. 一套小学生的试卷。。。
  5. 【OJ8756】砝码称重V2,可达性多重背包
  6. 期刊投稿状态_在省级期刊上发表论文可以用于评定中级职称吗?
  7. Numpy ndarry按行、列求和
  8. JDBCUtils——C3P0
  9. python virtualenv
  10. 遇到的一个很有趣的陷阱
  11. mysql读mdf_mdf文件如何导入MySQL数据库?
  12. 国际贸易术语解释通则(EXW 工厂交货…(指定地点))
  13. 第十二课 Java基础篇——面向对象进阶(三)
  14. 浅析 Hadoop 中的数据倾斜
  15. 使用Python和机器学习进行文本情感分类
  16. 基于SSM实现的水果店收银系统
  17. 给网页质量进行瘦身的办法-金瑞帆建站
  18. JAVA JDK8的介绍下载和安装(附网盘地址)
  19. 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!
  20. [Machine Learning] 方向导数梯度(Directional Derivative Gradient)

热门文章

  1. koa框架数据导出为excel格式
  2. 拼多多这样来挑选关键词|百择电商
  3. 【Microsoft Visual Studio 2010完成CLR窗体应用程序】计算器和画图板的设计
  4. python程序运行结果不停_关于python:在进程运行时不断打印Subprocess输出
  5. 如何查看.mdf文件数据库版本信息
  6. 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
  7. C++ 时间戳 时间相关函数
  8. html javascript div 加边框,html div 加边框样式
  9. java 重载条件
  10. Lightroom导入JPG格式的图像