ResponseBodyAdvice拦截Controller方法默认返回参数,统一处理返回值/响应体

为了解决老项目中接口返回格式改造的问题,本文探讨了如何使用ResponseBodyAdvice而不是拦截器来统一处理Controller方法的返回参数和响应体。由于@ResponseBody和@RestController会导致数据直接写入输出流,使得拦截器无法修改响应数据,因此选择了ResponseBodyAdvice,它可以在数据转化为响应格式前进行操作,实现了对返回值的统一处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 背景
    公司小程序项目改造需要后端接口统一数据返回 原来的封装数据返回格式不适合需要改造 老项目几百个接口 一个个改接口肯定不行。
    后来制定两套方案 一种 拦截器 另一种 ResponseBodyAdvice后来选择了ResponseBodyAdvice
    为什么不使用拦截器?因为之前的接口统一规范使用了@ResponseBody 而且带@RestController的类和带@ResponseBody的方法在被调用后response会直接写入输出流,在postHandle和afterCompletion这两个方法执行之前就已经把数据返回,导致这两个方法里面的response根本获取不到响应数据。
    而ResponseBodyAdvice拦截Controller方法默认返回参数,统一处理返回值/响应体 ResponseBodyAdvice可以在注解@ResponseBody将返回值处理成相应格式之前操作返回值。实现这个接口即可完成相应操作。
import com.alibaba.fastjson.JSON;import org.springframework.core.MethodParameter
在 Spring Cloud 微服务架构中,如果你想要在拦截器中打印 Controller 控制器的返回参数,你需要做以下步骤: 1. 创建一个实现 HandlerInterceptor 接口的拦截器类,用于拦截请求并处理返回参数。 ```java @Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; // 返回 true 表示继续执行后续的拦截器或控制器方法返回 false 表示中断后续的执行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 获取控制器方法返回值 if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Object returnValue = modelAndView.getModel().get("returnValue"); System.out.println("返回参数:" + returnValue); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 执行一些清理操作 } } ``` 2. 在配置类中注册拦截器。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor).addPathPatterns("/**"); } } ``` 在上述示例中,我们创建了一个名为 MyInterceptor 的拦截器,并将其应用于所有请求路径上。在拦截器的 postHandle 方法中,我们通过获取 HandlerMethod 对象,然后从 ModelAndView 中获取返回值。 请注意,这里的前提是控制器方法返回值存储在 ModelAndView 对象中,并使用 "returnValue" 作为键。如果你的控制器方法返回类型不是 ModelAndView,可以根据实际情况修改获取返回值的方式。 通过以上步骤,你可以在拦截器中打印 Controller 控制器的返回参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值