springboot mvc 统一错误处理

统一返回结果:

package com.caffebabe.codelife.controller;

import com.caffebabe.codelife.util.ErrorEnum;
import com.caffebabe.codelife.util.UniformException;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Result<T> {
    private boolean success = true;
    private int code = ErrorEnum.SUCCESS.getErrorCode();
    private String msg = ErrorEnum.SUCCESS.getErrorMsg();
    private T data;

    public Result(T data) {
        this.data = data;
    }

    public Result(Boolean success, Integer code, String msg, T data) {
        this(success, code, msg);
        this.data = data;
    }

    public Result(Boolean success, Integer code, String msg) {
        this.success = success;
        this.code = code;
        this.msg = msg;
    }

    public static Result<?> uniError(UniformException e) {
        Result<?> result = new Result<>(false, e.getErrorCode(), e.getErrorMsg());
        return result;
    }

    public static Result<?> otherError(ErrorEnum errorEnum) {
        Result<?> result = new Result<>(errorEnum);
        result.setMsg(errorEnum.getErrorMsg());
        result.setCode(errorEnum.getErrorCode());
        result.setSuccess(false);
        result.setData(null);
        return result;
    }
}

常见错误码

package com.caffebabe.codelife.util;

/**
 * ErrorEnum 定义了常见的系统错误码
 * 
 * <pre>
 * 200-成功 
 * 403-没有权限 
 * 401-没有认证
 * 400-请求错误
 * 404-未找到该资源
 * 500-服务器未知错误
 * </pre>
 */
public enum ErrorEnum {
    /** 200-成功 */
    SUCCESS(200, "成功"),
    /** 403-没有权限 */
    NO_PERMISSION(403, "没有权限"),
    /** 401-没有认证 */
    NO_AUTH(401, "没有认证"),
    /** 404-未找到该资源 */
    NOT_FOUND(404, "未找到该资源!"),
    /** 400-请求错误 */
    BAD_REQUEST(400, "请求错误!"),
    /** 500-服务器未知错误 */
    INTERNAL_SERVER_ERROR(500, "服务器未知错误");

    /** 错误码 */
    private Integer errorCode;

    /** 错误信息 */
    private String errorMsg;

    ErrorEnum(Integer errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

统一业务异常定义:

package com.caffebabe.codelife.util;

public class UniformException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    protected Integer errorCode;
    protected String errorMsg;

    public UniformException() {

    }

    public UniformException(Integer errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(Integer errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

处理validate错误

package com.caffebabe.codelife.controller;

import com.caffebabe.codelife.util.ErrorEnum;
import com.caffebabe.codelife.util.UniformException;

import org.springframework.validation.BindException;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理自定义异常
     * 
     * @param e UniformException
     * @return
     */
    @ExceptionHandler(value = UniformException.class)
    @ResponseBody
    public Result<?> bizExceptionHandler(UniformException e) {
        return Result.uniError(e);
    }

    /**
     * 处理MethodArgumentNotValidException异常
     * 
     * @param e 在rapplication/json格式提交,校验失败时抛出
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result<?> errorHandler(MethodArgumentNotValidException e) {
        var errorMsg = new StringBuilder();
        var re = e.getBindingResult();
        for (ObjectError error : re.getAllErrors()) {
            String[] codes = error.getCodes();
            String code = codes[0];
            errorMsg.append(code.substring(code.lastIndexOf(".") + 1));
            errorMsg.append(error.getDefaultMessage()).append(",");
        }
        errorMsg.delete(errorMsg.length() - 1, errorMsg.length());
        Result<?> result = new Result<>(false, ErrorEnum.BAD_REQUEST.getErrorCode(), errorMsg.toString());
        return result;
    }

    /**
     * 处理BindException异常,表单提交时抛出
     * 
     * @param bindException
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    public Result<?> errorHandler(BindException bindException) {
        BindingResult br = bindException.getBindingResult();
        StringBuilder errorMsg = new StringBuilder();
        for (ObjectError error : br.getAllErrors()) {
            errorMsg.append(error.getDefaultMessage()).append(",");
        }
        errorMsg.delete(errorMsg.length() - 1, errorMsg.length());
        Result<?> result = new Result<>(false, ErrorEnum.BAD_REQUEST.getErrorCode(), errorMsg.toString());
        return result;
    }

    /**
     * 处理其他异常
     * 
     * @param e Exception
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result<?> exceptionHandler(Exception e) {
        return Result.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
    }

}

请求示例

package com.caffebabe.codelife.controller;

import javax.validation.Valid;

import com.caffebabe.codelife.entity.Book;
import com.caffebabe.codelife.service.BookService;
import com.github.pagehelper.PageInfo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping
    public Result<PageInfo<Book>> getBookPage(@RequestParam("page_num") int pageNum,
            @RequestParam("page_size") int pageSize) {
        var page = bookService.findPage(pageNum, pageSize);
        Result<PageInfo<Book>> result = new Result<>(page);
        return result;
    }

    @PostMapping
    public Result<?> addBook(@Valid @RequestBody Book book) {
        bookService.addBook(book);
        return new Result<>(null);
    }

}

posted on 2020-11-10 21:14  caffebabe  阅读(148)  评论(0编辑  收藏  举报