Springboot 全局异常处理 + 统一接口返回

1. R类返回

=>common\ResponseEnum(R枚举)

public enum ResponseEnum {

    SUCCESS(200, "正确返回"),
    PAGE_NOT_FOUND(404, "找不到页面"),
    CODE_LOGIC_ERROR(500, "程序出错");

    private Integer status;
    private String message;

    private ResponseEnum(Integer status, String message){
        this.status = status;
        this.message = message;
    }

    public Integer getStatus(){
        return status;
    }

    public String getMessage(){
        return message;
    }
}

=>common\R(R类)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {

    private Integer status;
    private String message;
    private Object Data;

    public static R success(Object data, String message){
        R r = new R();
        r.setData(data);
        r.setMessage(message==null?ResponseEnum.SUCCESS.getMessage():message);
        r.setStatus(ResponseEnum.SUCCESS.getStatus());
        return r;
    }

    public static R success(Object data){
        return success(data, null);
    }

    public static R fail(Integer status, String message){
        R r = new R();
        r.setStatus(status);
        r.setMessage(message);
        r.setData(null);
        return r;
    }

    public static R fail(ResponseEnum responseEnum){
        R r = new R();
        r.setStatus(responseEnum.getStatus());
        r.setMessage(responseEnum.getMessage());
        r.setData(null);
        return r;
    }
}

2. Error返回(会用R类包装返回的Error)

=>exception\Error(Error枚举)

package com.wanghai.exception;

public enum ErrorEnum {

    SUCCESS(true, 200, "正常结束"),
    PAGE_NOT_FOUND(false, 404, "页面找不到"),
    LOGIC_ERROR(false, 500, "代码逻辑错误"),
    BUSSINESS_ERROR(false, 20001, "业务出错"),
    ORDER_ERROR(false, 20002, "订单出错");

    private Integer status;
    private String message;
    private boolean resultFlag;

    private ErrorEnum(boolean resultFlag, Integer status, String message){
        this.resultFlag = resultFlag;
        this.status = status;
        this.message = message;
    }

    public Integer getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }

    public boolean isResultFlag() {
        return resultFlag;
    }
}

=>exception\ErrorHandler(Error处理器)

package com.wanghai.exception;

import lombok.Data;

@Data
public class ErrorHandler {

    private Integer status;
    private String massage;
    private String ExceptionClass;

    public static ErrorHandler fail(ErrorEnum errorEnum, Throwable throwable){
        ErrorHandler handler = new ErrorHandler();
        handler.setStatus(errorEnum.getStatus());
        handler.setMassage(errorEnum.getMessage());
        handler.setExceptionClass(throwable.getClass().getName());
        return handler;
    }

    public static ErrorHandler fail(ErrorEnum errorEnum, Throwable throwable, String message){
        ErrorHandler handler = fail(errorEnum, throwable);
        handler.setMassage(message);
        return handler;
    }

    // 针对自定义异常的 Handler
    public static ErrorHandler fail(ErrorEnum errorEnum, String message, Class classname){
        ErrorHandler handler = new ErrorHandler();
        handler.setStatus(errorEnum.getStatus());
        handler.setMassage(message==null?errorEnum.getMessage():message);
        handler.setExceptionClass(classname.toString());
        return handler;
    }
}

=>exception\BussinessError & exception\OrderError(自定义异常)

package com.wanghai.exception;

import lombok.Data;

@Data
public class BussinessError extends RuntimeException{
    private Integer status;
    private String message;

    public BussinessError(Integer status, String message){
        this.status = status;
        this.message = message;
    }

    public BussinessError(ErrorEnum errorEnum){
        this.status = errorEnum.getStatus();
        this.message = errorEnum.getMessage();
    }
}
package com.wanghai.exception;

import lombok.Data;

@Data
public class OrderError extends RuntimeException{
    private Integer status;
    private String message;

    public OrderError(Integer status, String message){
        this.status = status;
        this.message = message;
    }

    public OrderError(ErrorEnum errorEnum){
        this.status = errorEnum.getStatus();
        this.message = errorEnum.getMessage();
    }
}

3. 全局异常处理 & 统一接口返回

=>config\GlobalExceptionHandler(全局异常处理)

import com.wanghai.exception.BussinessError;
import com.wanghai.exception.ErrorEnum;
import com.wanghai.exception.OrderError;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import com.wanghai.exception.ErrorHandler;


@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(Throwable.class)
    public ErrorHandler makeException(Throwable throwable, HttpServletRequest request){
        ErrorHandler handler = ErrorHandler.fail(ErrorEnum.LOGIC_ERROR, throwable);
        log.error("错误发生的位置为:" + request.getRequestURL());
        System.out.println(handler);
        return handler;
    }

    @ExceptionHandler(OrderError.class)
    public ErrorHandler makeOrderException(HttpServletRequest request){
        ErrorHandler handler = ErrorHandler.fail(ErrorEnum.ORDER_ERROR, "订单出错了-c", OrderError.class);
        log.error("错误发生的位置为:" + request.getRequestURL());
        System.out.println(handler);
        return handler;
    }

    @ExceptionHandler(BussinessError.class)
    public ErrorHandler makeBussinessException(HttpServletRequest request){
        ErrorHandler handler = ErrorHandler.fail(ErrorEnum.ORDER_ERROR, "业务出错了-c", OrderError.class);
        log.error("错误发生的位置为:" + request.getRequestURL());
        System.out.println(handler);
        return handler;
    }
}

=>config\ResultResponseHandler(统一接口返回)

import com.fasterxml.jackson.databind.ObjectMapper;
import com.wanghai.common.R;
import com.wanghai.exception.ErrorHandler;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;


@RestControllerAdvice
@Slf4j
public class ResultResponseHandler implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        if(body instanceof ErrorHandler){
            ErrorHandler handler = (ErrorHandler) body;
            return R.fail(handler.getStatus(), handler.getMassage());
        } else if (body instanceof String){
            ObjectMapper objectMapper = new ObjectMapper();
            R r = R.success(body);
            return objectMapper.writeValueAsString(r);
        } else if(body instanceof R){
            return body;
        }
        return R.success(body);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值