咱们都知道作项目通常都会有全局异常统一处理的类,那么这个类在Spring中能够用@ControllerAdvice来实现。
@ControllerAdvice ,这是一个很是有用的注解,顾名思义,这是一个加强的 Controller。使用这个 Controller ,能够实现三个方面的功能:java
全局异常处理
全局数据绑定
全局数据预处理
灵活使用这三个功能,能够帮助咱们简化不少工做,须要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中能够直接使用。web
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 注解用来指明异常的处理类型,咱们这里捕获所有异常。而后经过异常类型的判断进行相应的处理和封装,返回自定义的相应类和用自定义的异常类进行枚举构造,
这个能够根据不一样的实际状况来自行更改spring