spring 28 @ControllerAdvice 之 ResponseBodyAdvice

ResponseBodyAdvice 增强

ResponseBodyAdvice 增强 在整个 HandlerAdapter 调用过程中所处的位置

点击查看代码
@Configuration
public class WebConfig {

    @ControllerAdvice  //将所有返回值类型统一成自定义的结果类型 如 Resout 含有 code(状态码) msg(信息) data(原数据)
    static class MyControllerAdvice implements ResponseBodyAdvice<Object> {
        // 满足条件才转换
        @Override
        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
                //判断当前方法上是否有注解
            if (returnType.getMethodAnnotation(ResponseBody.class) != null ||
                    //AnnotationUtils spring 提供的工具 判断当前类上是否有注解或者组合注解
                AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null) {
//                returnType.getContainingClass().isAnnotationPresent(ResponseBody.class)) {
                return true;
            }
            return false;
        }

        // 将 User 或其它类型统一为 Result 类型
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
            if (body instanceof Result) {
                return body;
            }
            return Result.ok(body);
        }
    }

小结

  1. ResponseBodyAdvice 返回响应体前包装
  2. 在配置类中加了 @ControllerAdvice 并实现 ResponseBodyAdvice 接口 将所有返回值统一,如 常见的 Resout ,避免新手直接返回了数据,没用 Resout 包装。
posted @ 2022-07-08 17:02  xy7112  阅读(123)  评论(0)    收藏  举报