zoukankan      html  css  js  c++  java
  • SpringMVC的全局异常处理

    @ControllerAdvice的使用

    我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现。
    @ControllerAdvice ,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:

    全局异常处理
    全局数据绑定
    全局数据预处理
    灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用。

    package com.boss.hr.train.fishkkmybatis.handle;
    
    import com.boss.hr.train.fishkkmybatis.entity.Result;
    import com.boss.hr.train.fishkkmybatis.enums.DictionaryEnum;
    import com.boss.hr.train.fishkkmybatis.exception.BaseException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.validation.BindException;
    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * ExceptionHandel
     * 全局异常处理类
     *
     * @author fishkk
     * @version 1.0
     * @since 2019/7/27
     */
    @ControllerAdvice
    public class ExceptionHandle {
        private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    
        /**
          * 全局异常处理
          * 自定义异常  表单验证异常 和 未定义系统异常的处理
          * 转换成Result对象返回
          * @author fishkk
          * @since  2019/7/28
          * @param  e 被捕获的异常
          * @return  Result
          */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public Result handle(Exception e){
            if (e instanceof BaseException) {
                // 系统内部异常
                BaseException exception = (BaseException) e;
                return new Result<Object>(exception.getResultEnum(), null);
            }
            if(e instanceof BindException){
                // @Valid表单验证不通过
                BindException bindException = (BindException)e;
                List<ObjectError> errors = bindException.getAllErrors();
                List<String> errorMessages = new ArrayList<>();
                for (ObjectError objectError : errors){
                    errorMessages.add(objectError.getDefaultMessage());
                }
    
                return Result.error("-300", e.getMessage());
            } else {
                logger.error("!!!系统异常!!!", e);
                return new Result<Object>(DictionaryEnum.UNKNOW_ERROR, null);
            }
        }
    }
    

    @ExceptionHandler 注解用来指明异常的处理类型,我们这里捕获全部异常。然后通过异常类型的判断进行相应的处理和封装,返回自定义的相应类和用自定义的异常类进行枚举构造,
    这个可以根据不同的实际情况来自行更改

  • 相关阅读:
    linux共享库的版本控制
    c++:自己动手实现线程安全的c++单例类
    c++设计成员变量可动态调整的动态类结构
    c++中std::set自定义去重和排序函数
    python网络编程调用recv函数完整接收数据的三种方法
    c++ 以二进制和以文本方式读写文件的区别
    c++和python如何实现主机字节序和网络字节序的相互转换
    线控性能比拼,MKZ与CRV作为自动驾驶开发平台的全面测评
    css 简易 loading 加载图
    Element UI 中被隐藏的滚动条
  • 原文地址:https://www.cnblogs.com/fishkk/p/11371966.html
Copyright © 2011-2022 走看看