@RestControllerAdvice和ResponseBodyAdvice统一处理controller层接口返回
1. 理论知识
要对controller层的内容进行统一返回,需要用到 @ControllerAdvice ResponseBodyAdvice
- @RestControllerAdvice
一个方便的注释,它本身带有@ControllerAdvice和@ResponseBody注释,携带此注释的类型被视为控制器通知 总之,它就是对controller层的方法加强
- ResponseBodyAdvice
允许在@ResponseBody或ResponseEntity控制器方法执行之后,但在使用HttpMessageConverter编写body之前定制响应
简单理解:ResponseBodyAdvice接口是在controller层方法执行之后,在response返回给前端数据之前对reponse的数据进行处理,可以对数据进行统一的处理,从而可以使返回数据格式一致。
2. 举例说明
- 2.1 编写统一返回数据格式代码
@RestControllerAdvice
@Slf4j
public class UnifiedAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
//若加了@ResponseNotIntercept 则该方法不用做统一的拦截
AnnotatedElement annotatedElement = returnType.getParameterType();
ResponseNotIntercept annotation = AnnotationUtils.findAnnotation(annotatedElement, ResponseNotIntercept.class);
return annotation == null;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof CommonResult) return body;
CommonResult<Object> objectCommonResult = new CommonResult<>(ResultCode.SUCCESS, body);
//若未封装