SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案
現(xiàn)在比較常用的方式是給前端返回JSON,但是有些時候程序出現(xiàn)一些異常,導致前端頁面報錯不是很友好,所以就需要對項目進行全局的異常捕獲,返回給前端固定的格式,進行友好的處理!
話不多說,開始寫代碼
一.全局異常捕獲
1.1 全局捕獲
@Slf4j @RestControllerAdvice(annotations = {RestController.class}) public class BaseExceptionHandler { /** * <p> * 全局Base異常處理 * </p> * @version 1.0.0 * @author Dylan * @since 2020/2/27 * @param e */ @ExceptionHandler({BaseException.class,BusinessException.class}) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public R customExceptionHandler(BaseException e) { sysLog(); log.info("自定義異常 ---> {}",e); return R.error(e.getCode(),e.getMsg()); } /** * <p> * 其他類型的異常處理 * </p> * @version 1.0.0 * @author Dylan * @since 2020/2/27 * @param e */ @ExceptionHandler({Exception.class}) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public R customExceptionHandler(Exception e) { sysLog(); log.info("未知的運行異常 ---> ",e); return R.error(); } /** * <p> * 參數(shù)異常處理 * </p> * @version 1.0.0 * @author Dylan-haiji * @since 2020/2/28 * @param exception */ @ExceptionHandler(value= MethodArgumentNotValidException.class) public R methodNotValidHandler(MethodArgumentNotValidException exception) { sysLog(); log.info("參數(shù)異常 ---> ",exception); List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors(); return R.error(fieldErrors.get(0).getDefaultMessage()); } /** * <p> * 統(tǒng)一日志輸出 * </p> * @version 1.0.0 * @author Dylan-haiji * @since 2020/2/28 * @param * @return void */ private void sysLog(){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String requestUri = request.getRequestURI(); log.info("異常 method ---> {}",request.getMethod()); log.info("異常 requestURI ---> {}",requestUri); } }
1.2 基礎(chǔ)異常
public class BaseException extends RuntimeException{ private Integer code; private String msg; public BaseException(Integer code, String msg){ this.code = code; this.msg = msg; } public BaseException( String msg){ this.code = 500; this.msg = msg; } }
1.3 業(yè)務(wù)參數(shù)異常
public class BusinessException extends BaseException { public BusinessException(Integer code, String msg) { super(code, msg); } public BusinessException() { super(ConstantUtils.BUSINESS_DATA); } public BusinessException(String msg) { super(msg); } }
二.驗證
通過上面的配置,我們可以進行全局的異常捕獲,接下來我們以參數(shù)驗證為例進行驗證是否可用!
2.1 定義實體類
public class Demo implements Serializable { @NotBlank(message = "請選擇時間") private String endDate; @NotBlank(message = "請選擇范圍類型") private String value; }
2.2 定義接口
@PostMapping(value = "list") public R getOverView(@RequestBody @Valid Demo demo){ return R.ok(); }
這是我們調(diào)用接口,直傳一個參數(shù)!達到了我們的預(yù)期效果
當然我們處理業(yè)務(wù)的時候也可進行異常的拋出,這樣也會進行全局的捕獲!
這樣的接口返回就非常的友好了!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot啟動報錯Failed to determine a suitable driver class
這篇文章主要介紹了SpringBoot啟動報錯Failed to determine a suitable driver class,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Mybatis多數(shù)據(jù)源切換實現(xiàn)代碼
這篇文章主要介紹了Mybatis多數(shù)據(jù)源切換實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10

java集合_淺談Iterable和Iterator的區(qū)別

Spring?Boot?使用觀察者模式實現(xiàn)實時庫存管理的步驟