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

  • 相关阅读:
    项目alpha冲刺-测试
    项目Alpha冲刺--9/10
    项目Alpha冲刺--8/10
    项目Alpha冲刺--7/10
    项目Beta冲刺(1/7)(追光的人)(2019.5.23)
    Beta之前-凡事预则立(校园帮-追光的人)
    事后诸葛亮(追光的人)
    问题回答
    Alpha冲刺总结
    Alpha冲刺(10/10)——追光的人
  • 原文地址:https://www.cnblogs.com/fishkk/p/11371966.html
Copyright © 2020-2023  润新知