2022-02-17 二.全局统一返回处理

2022-02-17 全局统一返回处理

前言

统一返回值虽然很好用,但是在每个Controller曾的方法需要手动调用ResponseResult的静态方法,还是不够优雅,可以使用全局统一处理,统一到一个地方进行返回处理。

全局统一返回处理

处理类

package com.zsl.common.advice;

import com.zsl.common.annotation.NotResponseBody;
import com.zsl.common.http.ResponseResult;
import com.zsl.util.JsonUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 全局处理返回数据
 * @Author zsl
 * @Date 2021/12/29 14:09
 */
@RestControllerAdvice(basePackages = "com.zsl.controller")  //扫描的包
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        // 返回 true则执行 beforeBodyWrite方法,
        // 返回类型不是 ResponseResult,且没有 @NotResponseBody注解,会执行
        return !methodParameter.getParameterType().equals(ResponseResult.class) && !methodParameter.hasMethodAnnotation(NotResponseBody.class);
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // 若为 String类型,则直接返回 json字符串
        if (methodParameter.getGenericParameterType().equals(String.class)) {
            return JsonUtils.obj2Str(o);
        }
        return ResponseResult.success(o);
    }
}

注解

当我们不希望被统一返回处理时,添加@NotResponseBody注解进行跳过处理。

package com.zsl.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author zsl
 * @Date 2022/2/17 11:07
 * @Email 249269610@qq.com
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotResponseBody {
}

例子

原先:

@RestController
public class XxxController {

	@Autowired
	XxxService xxxService;

	@RequestMapping("xxx")
	public ResponseResult xxx() {
		return ResponseResult.success(xxxService.xxx());
	}
}

现在:

@RestController
public class XxxController {

	@Autowired
	XxxService xxxService;

	@RequestMapping("xxx")
	public Xxx xxx() {
		return xxxService.xxx();
	}
}

具体的处理由ResponseControllerAdvice来进行统一处理,Controller只需要考虑返回给前端的数据

注意

  • controller层的注解需要使用@RestController(复合注解), 也就是方法需要有@ResponseBody注解才能生效,只有@Controller注解不会经过全局统一返回处理
  • @RestControllerAdvice,最好加上要扫描的包,对basePackages进行赋值

下一篇跳转:3.表单验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值