Spring MVC 之 RequestBodyAdvice 与 ResponseBodyAdvice:请求 / 响应增强的核心实践
在 Spring MVC 4.0+ 中,RequestBodyAdvice 和 ResponseBodyAdvice 是两个强大的请求 / 响应增强接口,分别用于在 @RequestBody 参数解析前 / 后、@ResponseBody 响应写入前对数据进行拦截和处理。它们摆脱了传统拦截器(HandlerInterceptor)只能操作 HttpServletRequest/HttpServletResponse 流的限制,可直接针对Java 对象级别的数据进行加工(如加密解密、日志记录、统一格式封装),是前后端数据交互中 “横切关注点” 处理的最佳方案。
从 “接口作用→核心方法→实现步骤→实战场景” 四个维度,彻底讲透这两个接口的使用逻辑与价值。
核心概念:为什么需要 RequestBodyAdvice/ResponseBodyAdvice?
在传统开发中,若需对 @RequestBody 请求(如 JSON 入参)或 @ResponseBody 响应(如 JSON 出参)进行统一处理(如:
- 请求入参解密(前端加密传输,后端解密后解析);
- 响应出参统一格式封装(所有接口返回
{code:0, msg:"success", data:{}});
- 请求 / 响应日志记录(打印入参、出参详情,便于排查问题);
- 数据校验增强(补充自定义校验逻辑,如 Token 合法性校验);
传统方案(如拦截器 HandlerInterceptor)需手动读取 / 写入请求 / 响应流,存在流不可重复读取、数据格式解析复杂(如 JSON 字符串转 Java 对象)等问题。而 RequestBodyAdvice/ResponseBodyAdvice 直接在 Spring MVC 的参数解析 / 响应写入流程中拦截 Java 对象,无需处理流操作,开发效率和灵活性大幅提升。
RequestBodyAdvice:请求入参增强(@RequestBody 预处理)
RequestBodyAdvice 作用于标注 @RequestBody 的 Controller 方法参数,在参数被 HttpMessageConverter(如 Jackson)解析为 Java 对象前 / 后进行拦截处理,核心是 “加工请求数据,确保解析出的对象符合业务需求”。
1. 接口核心方法解析
RequestBodyAdvice 接口包含 4 个核心方法,执行顺序为:supports() → handleEmptyBody()(可选)→ beforeBodyRead() → afterBodyRead():