咱們都知道作項目通常都會有全局異常統一處理的類,那麼這個類在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