SpringMVC的全局异常处理

Posted fishkk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 注解用来指明异常的处理类型,我们这里捕获全部异常。然后通过异常类型的判断进行相应的处理和封装,返回自定义的相应类和用自定义的异常类进行枚举构造,
这个可以根据不同的实际情况来自行更改

以上是关于SpringMVC的全局异常处理的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC--全局异常处理

springmvc 全局异常ControllerAdviceExceptionHandler

springmvc 全局异常ControllerAdviceExceptionHandler

springMVC全局Exception异常处理SimpleMappingExceptionResolver

SpringMvc,Springboot统一校验自定义异常全局异常处理

SpringMvc,Springboot统一校验自定义异常全局异常处理