一、定义错误状态枚举类

/**
 * @author beth
 * @data 2019-11-01 20:31
 */
public interface IErrorCode {

    default Integer getCode() {
        return Integer.valueOf(0);
    }

    default String getMsg() {
        return "";
    }

}

/**
 * @author beth
 * @data 2019-11-01 18:15
 */
@Getter
public enum ErrorCodeEnum implements IErrorCode {

    UN_KNOWN(-10000, "未知错误"),
    SUCCESS(0, "请求成功"),

    BAD_REQUEST(400, "参数错误"),
    UNAUTHORIZED(401, "未经授权"),
    FORBIDDEN(403, "没有权限"),
    NOT_FOUND(404, "请求的资源不存在"),
    METHOD_NOT_ALLOWED(405, "请求方式不支持"),
    INTERNAL_SERVER_ERROR(500, "系统繁忙"),
    SERVICE_UNAVAILABLE(503, "服务不可用"),
    /** 自定义异常之返回值为空 */
    NullResponseException(5002, "返回空值"),
    ;

    /**
     * 状态枚举
     *
     * @param code 状态码
     * @param msg  提示信息
     */
    private ErrorCodeEnum(final Integer code, final String msg) {
        this.code = code;
        this.msg = msg;
    }

    private final Integer code;
    private final String msg;



    /**
     * 根据 code 获取对应错误枚举
     *
     * @param code
     * @return
     */
    public static ErrorCodeEnum valueOf(Integer code) {
        ErrorCodeEnum[] enums = ErrorCodeEnum.values();
        for(ErrorCodeEnum errorCodeEnum : enums) {
            if(errorCodeEnum.getCode().equals(code)) {
                return errorCodeEnum;
            }
        }
        return ErrorCodeEnum.UN_KNOWN;
    }

    /**
     * 返回状态码的字符串形式
     *
     * @return
     */
    @Override
    public String toString() {
        return String.format(" ErrorCode:{code=%s, msg=%s} ", code, msg);
    }

}

二、封装返回数据

/**
 * 统一定义返回类
 * @author beth
 * @data 2019-11-01 11:18
 */
@Data
public class ReturnVO {

    /**
     * 返回代码
     */
    private Integer code;

    /**
     * 返回信息
     */
    private String message;

    /**
     * 返回数据
     */
    private Object data;


    /**
     * 默认构造,返回操作正确的返回代码和信息
     */
    public ReturnVO() {
        this.setCode(ErrorCodeEnum.SUCCESS.getCode());
        this.setMessage(ErrorCodeEnum.SUCCESS.getMsg());
    }

    /**
     * 构造一个返回特定代码的ReturnVO对象
     * @param errorCodeEnum
     */
    public ReturnVO(ErrorCodeEnum errorCodeEnum) {
        this.setCode(errorCodeEnum.getCode());
        this.setMessage(errorCodeEnum.getMsg());
    }

    /**
     * 默认值返回,默认返回正确的code和message
     * @param data
     */
    public ReturnVO(Object data) {
        this.setCode(ErrorCodeEnum.SUCCESS.getCode());
        this.setMessage(ErrorCodeEnum.SUCCESS.getMsg());
        this.setData(data);
    }

    /**
     * 构造返回代码,以及自定义的错误信息
     * @param code
     * @param message
     */
    public ReturnVO(Integer code, String message) {
        this.setCode(code);
        this.setMessage(message);
    }

    /**
     * 构造自定义的code,message,以及data
     * @param code
     * @param message
     * @param data
     */
    public ReturnVO(Integer code, String message, Object data) {
        this.setCode(code);
        this.setMessage(message);
        this.setData(data);
    }

    @Override
    public String toString() {
        return "ReturnVO{" +
                "code='" + code + '\'' +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}

三、使用前一步封装的类返回数据

/**
 * 新增
 */
@ApiOperation(value = "新增数据")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public ReturnVO add(@RequestBody UserInfo entity){
    int result = iUserInfoService.insert(entity);
    if(result>0){
        return new ReturnVO();
    }
    return new ReturnVO(ErrorCodeEnum.INTERNAL_SERVER_ERROR);
 }

四、前端返回结果

spring boot 统一返回值-LMLPHP

五、统一封装返回值和异常处理

/**
 *  统一封装返回值和异常处理
 * @author beth
 * @data 2019-11-01 23:11
 */
@Slf4j
@Aspect
@Order(5)
@Component
public class ResponseAop {
    /**
     * 切点
     */
    @Pointcut("execution(public * com.xiao.permission_system.controller..*(..))")
    public void httpResponse() {
    }

    /**
     * 环切
     */
    @Around("httpResponse()")
    public ReturnVO handlerController(ProceedingJoinPoint proceedingJoinPoint) {
        ReturnVO returnVO = new ReturnVO();
        try {
            //获取方法的执行结果
            Object proceed = proceedingJoinPoint.proceed();
            //如果方法的执行结果是ReturnVO,则将该对象直接返回
            if (proceed instanceof ReturnVO) {
                returnVO = (ReturnVO) proceed;
            } else {
                //否则,就要封装到ReturnVO的data中
                returnVO.setData(proceed);
            }
        }  catch (Throwable throwable) {
            //如果出现了异常,调用异常处理方法将错误信息封装到ReturnVO中并返回
            returnVO = handlerException(throwable);
        }
        return returnVO;
    }

    /**
     * 异常处理
     */
    private ReturnVO handlerException(Throwable throwable) {
        ReturnVO returnVO = new ReturnVO();
        //这里需要注意,返回枚举类中的枚举在写的时候应该和异常的名称相对应,以便动态的获取异常代码和异常信息
        //获取异常名称的方法
        String errorName = throwable.toString();
        int code = errorName.lastIndexOf(".") + 1;
        //直接获取properties文件中的内容
        returnVO.setMessage(ErrorCodeEnum.valueOf(code).getMsg());
        returnVO.setCode(code);
        return returnVO;
    }
}

参考:https://www.cnblogs.com/viyoung/p/10188456.html

11-03 00:57