封装全局统一返回实现

返回信息封装


/**
 * @Author : 
 * @Time : 2020/5/24
 * @Description: 返回错误信息
 **/
public interface IBizError {
    String getCode();
    String getMsg();
}


/**
 * @Author : 
 * @Time : 2020/5/24 
 * @Description: 返回错误信息
 **/
public enum BizErrorEnum implements IBizError {
    /***/
    SUCCESS("0000", "success"),
    //1000以下为系统级错误
    SYSTEM_ERROR("0001", "system error");


    BizErrorEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private String code;
    private String msg;

    @Override
    public String getCode() {
        return this.code;
    }

    @Override
    public String getMsg() {
        return this.msg;
    }
}

返回数据格式类

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;

/**
 * @Author : 
 * @Time : 2020/8/3
 * @Description: 统一返回值
 **/
@Data
@Slf4j
public class BizResult<T> implements Serializable {
    private String code;
    private T data;
    private String msg;

    public static <T> BizResult<T> success(T obj) {
        BizResult bizResult = new BizResult();
        bizResult.setCode(BizErrorEnum.SUCCESS.getCode());
        bizResult.setMsg(BizErrorEnum.SUCCESS.getMsg());
        bizResult.setData(obj);
        return bizResult;

    }

    public static <T> BizResult<T> error(T obj) {
        BizResult bizResult = new BizResult();
        bizResult.setCode(BizErrorEnum.SYSTEM_ERROR.getCode());
        bizResult.setMsg(BizErrorEnum.SYSTEM_ERROR.getMsg());
        bizResult.setData(obj);
        return bizResult;

    }

    public static <T> BizResult<T> error(String code, String msg) {
        BizResult bizResult = new BizResult();
        bizResult.setCode(code);
        bizResult.setMsg(msg);
        return bizResult;

    }

    /**
     * 判断是否返回成功,失败并打印日志
     *
     * @param bizResult
     */
    public static Boolean checkIsSuccess(BizResult bizResult) {
        if (bizResult == null || !bizResult.getCode().equals(BizErrorEnum.SUCCESS.getCode())) {
            return false;
        }
        return true;
    }
}

全局返回封装


import com.netflix.hystrix.exception.HystrixRuntimeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.List;
import java.util.stream.Collectors;

@ControllerAdvice(value = {"扫描包路径", "org.springframework.boot.autoconfigure.web.servlet.error"})
@Slf4j
public class BizResponseBodyAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return returnType.getParameterType() != BizResult.class;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return BizResult.success(body);
    }


    @ResponseBody
    @ExceptionHandler(HystrixRuntimeException.class)
    public BizResult hystrixRuntimeException(HystrixRuntimeException e) {
        log.error(e.getMessage(), e);
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "远程接口调用超时");
    }

    @ResponseBody
    @ExceptionHandler(DataIntegrityViolationException.class)
    public BizResult dataIntegrityViolationException(DataIntegrityViolationException e) {
        log.error(e.getMessage(), e);
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "数据持久化失败");
    }

    @ResponseBody
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public BizResult httpMessageNotReadableException(HttpMessageNotReadableException e) {
        log.error(e.getMessage(), e);
        if (e.getLocalizedMessage().contains("JSON parse error")) {
            return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "输入参数异常,请核实!");
        }
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
    }

    @ResponseBody
    @ExceptionHandler(IllegalStateException.class)
    public BizResult illegalStateException(IllegalStateException e) {
        log.error(e.getMessage(), e);
        if (e.getLocalizedMessage().contains("io.undertow.server.RequestTooBigException")) {
            return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "文件大小超出最大限制,最大可上传10M文件");
        }
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public BizResult methodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) {
        log.error(e.getMessage(), e);
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), "输入参数异常,请核实!");
    }

    @ResponseBody
    @ExceptionHandler(IllegalArgumentException.class)
    public BizResult illegalArgumentException(IllegalArgumentException e) {
        log.error(e.getMessage(), e);
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), e.getLocalizedMessage());
    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BizResult methodArgumentNotValid(MethodArgumentNotValidException e) {

        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining(";"));
        log.error(e.getMessage(), e);
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), message);
    }

    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public BizResult errorHandler(Exception ex) {
        ex.printStackTrace();
        return BizResult.error(BizErrorEnum.SYSTEM_ERROR.getCode(), ex.getLocalizedMessage());
    }

}

需要jar包

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

测试效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值