• 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);
        }
    
    }
    
  • 相关阅读:
    nm命令与符号说明
    (OK) 编译xerces-c-3.1.2(动态库)—CentOS 7— android-ndk
    【19.00%】【vijos p1906】联合权值
    【30.00%】【vijos 1909】寻找道路
    【23.33%】【hdu 5945】Fxx and game
    【32.26%】【codeforces 620C】Pearls in a Row
    【第400篇题解纪念2016年10月28日】【28.10%】【codeforces 617E】XOR and Favorite Number
    【20.00%】【codeforces 44G】Shooting Gallery
    【19.27%】【codeforces 618D】Hamiltonian Spanning Tree
    【17.00%】【codeforces 621D】Rat Kwesh and Cheese
  • 原文地址:https://www.cnblogs.com/teacherma/p/13956069.html
Copyright © 2020-2023  润新知