ResponseBodyAdvice是什么?
ResponseBodyAdvice是什么?
在Spring MVC中,ResponseBodyAdvice
是一个强大的扩展接口,用于在响应体被HttpMessageConverter写入响应流之前对其进行拦截和处理。它可以统一修改、增强或转换Controller返回的响应数据,是实现全局响应处理的重要工具。
一、基本概念
ResponseBodyAdvice
位于org.springframework.web.servlet.mvc.method.annotation
包下,其核心作用是:
拦截Controller方法返回的响应数据(通过@ResponseBody
或@RestController
标识的方法),在数据被转换成HTTP响应体之前进行自定义处理。
二、核心方法
ResponseBodyAdvice
接口定义了两个核心方法,需要实现类重写:
1. supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType)
- 作用:判断当前
ResponseBodyAdvice
是否支持处理当前请求的返回类型和消息转换器。 - 参数:
returnType
:Controller方法的返回类型信息(包含方法、参数、注解等)。converterType
:用于处理响应体的HttpMessageConverter
类型(如MappingJackson2HttpMessageConverter
用于JSON转换)。
- 返回值:
boolean
类型,true
表示支持处理,会执行beforeBodyWrite
方法;false
表示不处理。
2. beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response)
- 作用:在响应体被写入响应流之前,对响应数据(
body
)进行处理。 - 参数:
body
:Controller方法返回的原始数据(可能为null
)。returnType
:同supports
方法,返回类型信息。selectedContentType
:选中的响应媒体类型(如application/json
)。selectedConverterType
:选中的消息转换器类型。request
:当前请求对象。response
:当前响应对象(可用于设置响应头、状态码等)。
- 返回值:处理后的响应数据(类型需与原始
body
兼容,否则可能导致转换失败)。
三、使用方式
要使用ResponseBodyAdvice
,需创建一个实现类,并通过@ControllerAdvice
注解标识(使其成为全局增强器,被Spring扫描并应用)。
示例:统一响应格式
最常见的场景是将所有接口的响应数据统一包装成固定格式(如{code: 200, message: "success", data: ...}
),避免在每个Controller中重复处理。