全局结果/异常返回统一处理

package com.aoyang.shop.config;

import com.aoyang.common.result.Result;
import com.aoyang.shop.common.GlobalException;
import com.aoyang.shop.common.GlobalExceptionCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**

  • @description: 全局返回值统一包装

  • @author:

  • @createDate: 2021/4/14
    */
    @Slf4j
    @RestControllerAdvice(basePackages = “com.aoyang.shop”)
    public class ResponseConfig implements ResponseBodyAdvice {

    /**

    • 哪些返回值类型需要进行处理

    • @param methodParameter

    • @param aClass

    • @return
      */
      @Override
      public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {

      /*
      不能够包装字符串类型,否则会因为转换器不匹配导致字符串转换异常
      若必须返回单个字符串,需要使用 new Result("");
      */
      final String returnTypeName = methodParameter.getParameterType().getName(); //这里是接收到的返回值的类型

      if (Result.class.getName().equals(returnTypeName)
      || “java.lang.String”.equals(returnTypeName)) {
      return Boolean.FALSE;
      }

      return Boolean.TRUE;
      }

    /**

    • 在返回之前

    • @param o

    • @param methodParameter

    • @param mediaType

    • @param aClass

    • @param serverHttpRequest

    • @param serverHttpResponse

    • @return
      */
      @Override
      public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {

      /*
      若返回值类型为 void 则默认为成功
      /
      final String returnTypeName = methodParameter.getParameterType().getName(); //这里是接收到的返回值的类型
      log.info(“返回值类型:[{}]”, returnTypeName);
      /

      若返回值不是 json 类型则直接返回
      否则会出现类型转换异常
      接口不能直接返回字符串类型,否则默认的转换器无法进行解析并报错,若必须返回单个字符串,需要使用 new GlobalResponseWrapper().data(""); , 在前面的判断会直接将包装器返回
      */
      if (!mediaType.includes(MediaType.APPLICATION_JSON)) {
      return o;
      }

      if (GlobalExceptionCode.class.getName().equals(returnTypeName)) {
      Result result = new Result();
      result.setCode(((GlobalExceptionCode) o).getCode());
      result.setMessage(((GlobalExceptionCode) o).getMsg());
      return new Result();
      }

      Result result = new Result();
      result.setCode(GlobalExceptionCode.SUCCESS.getCode());
      result.setMessage(GlobalExceptionCode.SUCCESS.getMsg());
      result.setData(o);
      return result;
      }

    /**

    • 对异常的处理
    • @param e
    • @param req
    • @return
      */
      @ExceptionHandler(Exception.class)
      public Result handleException(Exception e, HttpServletRequest req) {
      Result result = new Result();
      //业务异常
      if (e instanceof GlobalException) {
      //全局GlobalException异常拦截处理
      result.setCode(((GlobalException) e).getCode().getCode());
      result.setMessage(((GlobalException) e).getCode().getMsg());
      } else if (e instanceof MethodArgumentNotValidException) {
      //@Valid校验请求参数抛出的异常
      BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
      List allErrors = bindingResult.getAllErrors();
      StringBuffer errorMsg = new StringBuffer("");
      if (allErrors != null && allErrors.size() > 0) {
      for (ObjectError allError : allErrors) {
      if (StringUtils.isEmpty(allError.toString())) {
      errorMsg.append(allError.getDefaultMessage());
      } else {
      errorMsg.append("," + allError.getDefaultMessage());
      }
      }
      }
      result.setCode(GlobalExceptionCode.REQUEST_PARAM_ERROR.getCode());
      result.setMessage(errorMsg.toString());
      } else if (e instanceof Exception) {//系统异常
      //其他异常
      result.setCode(GlobalExceptionCode.ERROR.getCode());
      result.setMessage(e.toString());
      } else {
      result.setCode(GlobalExceptionCode.ERROR.getCode());
      result.setMessage(GlobalExceptionCode.ERROR.getMsg());
      }
      return result;

    }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值