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