前言:

接口类项目开发时,为了便于后期查找问题,一般会拦截器或过滤器中记录每个接口请求的参数与响应值记录,
请求参数很容易从request中获取,但controller的返回值无法从response中获取,有一个简单的方法,在controller接口的最后将返回值保存到request域中,这种方法虽然简单,但是开发起来太麻烦,需要在每个controller的最后添加一行代码,且该功能不属于业务功能,不应该接口中去实现,应该有个全局的处理方法。
 
ControllerAdvice是springmvc controller增强器
 
ControllerAdvice三个用处:
1. ModelAttribute: 暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
2. InitBinder : 用于自定义@RequestMapping 方法参数绑定
3. ResponseBodyAdvice : 用于@ResponseBody返回值增加处理
ControllerAdvice初始化:
Spring mvc 启动时调用RequestMappingHandlerAdapter类的initControllerAdviceCache()方法进行初始化
 
ResponseBodyAdvice : 可以对@ResponseBody的返回值进行加工处理,它是一个接口类,具体处理可以自定义实现类注入到responseBodyAdviceBeans中既可,注入过程由RequestMappingHandlerAdapter类的initControllerAdviceCache去做,开发者只需要自定义实现类实现ResponseBodyAdvice 接口并添加类注解@ControllerAdvice
 

ResponseBodyAdvice

ResponseBodyAdvice是spring4.1的新特性,其作用是在响应体写出之前做一些处理;比如,修改返回值、加密等。

我在项目中的用到@ControllerAdvice,ResponseBodyAdvice来做一个Controller增强器,将Controller接口的响应(Response)放到请求上下文中 。

  介绍:https://blog.csdn.net/u012852374/article/details/53837156

项目中Controller增强器:

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import com.generalichina.wolong.base.BaseResponse; @ControllerAdvice
public class ResponseAdvisor implements ResponseBodyAdvice<Object> { /**
* 判断支持的类型
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
     //注意,这里必须返回true,否则不会执行beforeBodyWrite方法
return true;
} /**
* 过滤
*
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) { String requestPath = request.getURI().getPath();// 普通response不进行过滤
if (!requestPath.startsWith("/credit")) {
return body;
} //如果是返回客户端模板类不进行过滤
if (body instanceof BaseResponse) {
return body;
} return new BaseResponse(body);
} }

RequestBodyAdvice和ResponseBodyAdvice

最新文章

  1. Spring:Aop before after afterReturn afterThrowing around 的原理
  2. Struts2 讲解笔记
  3. ci控制器写规范
  4. Jquery 知识表
  5. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示
  6. KeybMap 键盘映射工具更新至 V1.5(修订)
  7. 【java】静态方法声明与调用习题
  8. CentOS 6.5 开机启动指定服务
  9. 【网站管理1】_dede织梦后台如何发布文章
  10. 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端
  11. 3种方法来在Linux电脑上查找文件
  12. 按住CTRL多选,按住shift连选的实现
  13. python 迭代器 一个奇怪的解决方法
  14. 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
  15. RestFramework自定制之认证和权限、限制访问频率
  16. windows中连接hive-客户端
  17. Java并发编程原理与实战四十一:重排序 和 happens-before
  18. python 字符串的反转
  19. 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆
  20. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

热门文章

  1. Mac OS X上如何实现到Linux主机的ssh免登陆
  2. 【Unity】协程Coroutine及Yield常见用法
  3. wifi 模块RTL8188以及mt7601u 移植测试
  4. TCP和UDPsocket中SO_SNDBUF和SO_RCVBUF_转
  5. CentOS防SYN攻击
  6. 如何在ROS中使用PCL—数据格式(1)
  7. Windows 管理
  8. oracle的启动和停用
  9. R语言基本操作函数(1)变量的基本操作
  10. ConsoleHelper 类