zoukankan      html  css  js  c++  java
  • spring boot GlobalExceptionHandler @RestControllerAdvice @ExceptionHandler

    package me.zhengjie.common.exception.handler;
    
    import lombok.extern.slf4j.Slf4j;
    import me.zhengjie.common.exception.BadRequestException;
    import me.zhengjie.common.exception.EntityExistException;
    import me.zhengjie.common.exception.EntityNotFoundException;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.security.access.AccessDeniedException;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import static org.springframework.http.HttpStatus.BAD_REQUEST;
    import static org.springframework.http.HttpStatus.FORBIDDEN;
    import static org.springframework.http.HttpStatus.NOT_FOUND;
    
    /**
     * @author jie
     * @date 2018-11-23
     */
    @Slf4j
    @RestControllerAdvice
    public class GlobalExceptionHandler {
    
        /**
         * 处理所有不可知的异常
         * @param e
         * @return
         */
        @ExceptionHandler(Exception.class)
        public ResponseEntity handleException(Exception e){
            // 打印堆栈信息
            log.error(getStackTrace(e));
            ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 处理 接口无权访问异常AccessDeniedException
         * @param e
         * @return
         */
        @ExceptionHandler(AccessDeniedException.class)
        public ResponseEntity handleAccessDeniedException(AccessDeniedException e){
            // 打印堆栈信息
            log.error(getStackTrace(e));
            ApiError apiError = new ApiError(FORBIDDEN.value(),e.getMessage());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 处理自定义异常
         * @param e
         * @return
         */
        @ExceptionHandler(value = BadRequestException.class)
        public ResponseEntity<ApiError> badRequestException(BadRequestException e) {
            // 打印堆栈信息
            log.error(getStackTrace(e));
            ApiError apiError = new ApiError(e.getStatus(),e.getMessage());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 处理 EntityExist
         * @param e
         * @return
         */
        @ExceptionHandler(value = EntityExistException.class)
        public ResponseEntity<ApiError> entityExistException(EntityExistException e) {
            // 打印堆栈信息
            log.error(getStackTrace(e));
            ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 处理 EntityNotFound
         * @param e
         * @return
         */
        @ExceptionHandler(value = EntityNotFoundException.class)
        public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) {
            // 打印堆栈信息
            log.error(getStackTrace(e));
            ApiError apiError = new ApiError(NOT_FOUND.value(),e.getMessage());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 处理所有接口数据验证异常
         * @param e
         * @returns
         */
        @ExceptionHandler(MethodArgumentNotValidException.class)
        public ResponseEntity<ApiError> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
            // 打印堆栈信息
            log.error(getStackTrace(e));
            String[] str = e.getBindingResult().getAllErrors().get(0).getCodes()[1].split("\.");
            StringBuffer msg = new StringBuffer(str[1]+":");
            msg.append(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
            ApiError apiError = new ApiError(BAD_REQUEST.value(),msg.toString());
            return buildResponseEntity(apiError);
        }
    
        /**
         * 统一返回
         * @param apiError
         * @return
         */
        private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
            return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus()));
        }
    
        /**
         * 获取堆栈信息
         * @param throwable
         * @return
         */
        private String getStackTrace(Throwable throwable)
        {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            try {
                throwable.printStackTrace(pw);
                return "
    "+sw.toString();
            } finally {
                pw.close();
            }
        }
    }
    package me.zhengjie.common.exception.handler;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import lombok.Data;
    import java.time.LocalDateTime;
    
    /**
     * @author jie
     * @date 2018-11-23
     */
    @Data
    class ApiError {
    
        private Integer status;
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime timestamp;
        private String message;
    
        private ApiError() {
            timestamp = LocalDateTime.now();
        }
    
        public ApiError(Integer status,String message) {
            this();
            this.status = status;
            this.message = message;
        }
    }
  • 相关阅读:
    python基础之函数(基础七)
    python基础之文件操作(基础六)
    python基础之数据类型补充(基础五)
    python之深浅拷贝(基础四)
    python基础数据类型之字典(基础三)
    python基础数据类型之列表,元组(基础二)
    python基础入门二
    随笔
    oss 上传照片失败
    mysql 同表查询更新
  • 原文地址:https://www.cnblogs.com/tonggc1668/p/11220298.html
Copyright © 2011-2022 走看看