Java学习笔记

SpringMVC中统一修改返回值JSON的格式处理

2021-12-29  本文已影响0人  想象之中丶意料之外

实现步骤

  1. 先定义统一返回类JsonReturn
@Data
public class JsonReturn {
    private int code;
    private String msg = "";
    private Object result = null;
}
  1. 自定义类,实现ResponseBodyAdvice接口中的方法。在方法中,完成逻辑处理
  2. 给自定义类,加上 @ControllerAdvice 完成所有Controller类增强功能【@ControllerAdvice注解:SpringMVC 中 @ControllerAdvice 注解的三种使用场景!

/**
 * 通过 @ControllerAdvice + 实现 ResponseBodyAdvice 接口。
 * 完成 统一返回结果处理
 */
@ControllerAdvice
public class ReturnJsonResponseBodyAdvice implements ResponseBodyAdvice<Object> {
    /**
     * 是否支持 该 返回体 通知器
     * true:表示支持
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        /**
         * 如果走的是 FastJsonHttpMessageConverter 消息转换器,
         * 则MyResponseBody 通知器,来完成完成统一JSON格式返回
         */
        Class<FastJsonHttpMessageConverter> aClass = FastJsonHttpMessageConverter.class;

        // 获取 Controller中方法上的 @ResponseBody注解
        ResponseBody isMethodResponseBody = returnType.getMethodAnnotation(ResponseBody.class);
        Class<?> cClass = returnType.getContainingClass();
        // 判断Controller类中是否包含 @RestController 注解
        boolean isRestController = cClass.isAnnotationPresent(RestController.class);
        // 判断Controller类中是否包含 @ResponseBody注解
        boolean isResponseBody = cClass.isAnnotationPresent(ResponseBody.class);

        /**
         * 如果:1、走的是FastJsonHttpMessageConverter消息转换器
         * 或 Controller类上有@ResponseBody注解
         * 或 Controller类上有 @RestController注解
         * 或 Controller中的方法上有 @ResponseBody注解
         * 则:该 ResponseBody通知器主持
         */
        if (converterType == aClass || isResponseBody || isRestController || null != isMethodResponseBody) {
            System.out.println("走的是 FastJsonHttpMessageConverter 转换器");
            return true;
        }
        return false;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        /**
         * 将需要返回的实际结果,
         * 设置到统一返回格式对象的result属性中
         */
        if (body instanceof JsonReturn) {
            return body;
        } else {
            JsonReturn jsonReturn = new JsonReturn();
            jsonReturn.setResult(body);
            return jsonReturn;
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读