<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案開發中出現異常時很平常不過的事情,我們處理異常也有很多種方式,可能如下:
public int div(int a ,int b){ int c=0; try{ c=a/b; }catch (Exception ex){ ex.printStackTrace(); } return c; }
如果我們這樣處理異常,程式碼中就會出現特別多的例外處理模組,這樣程式碼就會變得可讀性非常差,而且業務模組邏輯會夾雜特別多的非業務邏輯。但是在專案開發的過程中我們應該將主要精力放在業務模組,除了必要的例外處理模組最好不要再包含其他無關緊要的程式碼。那麼我們如何處理專案中無處不在的異常呢?這就引出了我們要介紹的全域性例外處理方法,主要有兩種種方式:
HandlerExceptionResolver。
@ControllerAdvice+@ExceptionHandler 今天我們主要介紹一下@ControllerAdvice+@ExceptionHandler模式處理全域性異常。
首先我們先介紹一下@ControllerAdvice和@ExceptionHandler
@ControllerAdvice註解: 他是一個比較特殊的@Component,用於定義全域性例外處理類作用在所有的@Controller型別的介面上。
@ExceptionHandler註解: 用於宣告處理異常的方法。
@ControllerAdvice+@ExceptionHandler只要設計得當,就不用再在Controller使用trg-catch了!下面我們先寫介紹一個Controller層全域性例外處理類。
@ControllerAdvice public class GlobalExceptionHandler { @ResponseBody @ExceptionHandler(Exception.class) public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception { Map<String, Object> result = new HashMap<>(3); String message =exception.getMessage()+request.getRequestURL().toString(); return CommonResult.failed(message); } }
注:@ResponseBody的作用其實是將java物件轉為json格式的資料。然後到這裡為止,一個簡單的全域性例外處理解決方式就完成了,這只是一個簡單的例外處理方式,遠遠不能達到完整專案中全域性例外處理的方案。
我們專案中業務處理,可以通過自定義的異常知道哪一個模組發生異常,並且不同的業務模組也有不同的例外處理方式,這也方便我們做擴充套件
public class ServiceException extends RuntimeException { private IErrorCode errorCode; public ServiceException(IErrorCode errorCode) { super(errorCode.getMessage()); this.errorCode = errorCode; } public ServiceException(String message) { super(message); } public ServiceException(Throwable cause) { super(cause); } public ServiceException(String message, Throwable cause) { super(message, cause); } public IErrorCode getErrorCode() { return errorCode; } }
@ControllerAdvice public class GlobalExceptionHandler { /** * 處理所有Service層異常 */ @ResponseBody @ExceptionHandler(value = ServiceException.class) public CommonResult handle(ServiceException e) { if (e.getErrorCode() != null) { return CommonResult.failed(e.getErrorCode()); } return CommonResult.failed(e.getMessage()); } /** * 處理所有不可知的異常 */ @ResponseBody @ExceptionHandler(Exception.class) public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception { Map<String, Object> result = new HashMap<>(3); String message =exception.getMessage()+request.getRequestURL().toString(); return CommonResult.failed(message); } }
在使用者登入Model欄位上註解資料校驗規則。
@Data @EqualsAndHashCode(callSuper = false) public class UserLoginParam { @NotEmpty private String username; @NotEmpty private String password; }
SpringBoot中可以使用@Validated + @RequestBody註解方式實現資料繫結和資料校驗。例如登入方式為:
@ApiOperation(value = "登入以後返回token") @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) { String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword()); if (token == null) { return CommonResult.validateFailed("使用者名稱或密碼錯誤"); } Map<String, String> tokenMap = new HashMap<>(); tokenMap.put("token", token); tokenMap.put("tokenHead", tokenHead); return CommonResult.success(tokenMap); }
如果資料校驗不對資料丟擲的異常為MethodArgumentNotValidException,所以我們可以在全域性例外處理類中新增對MethodArgumentNotValidException異常的處理宣告,就可以實現全域性處理資料校驗和繫結的異常了,實現如下:
@ResponseBody @ExceptionHandler(value = MethodArgumentNotValidException.class) public CommonResult handleValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String message = null; if (bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); if (fieldError != null) { message = fieldError.getField()+fieldError.getDefaultMessage(); } } return CommonResult.validateFailed(message); }
通過上面介紹的未知異常、資料校驗和自定義全域性異常所有的Controller層的例外處理方式全部都集中到了GlobalExceptionHandler類中,那麼我們在Controller類中就不再需要收到記錄錯誤了。
@ControllerAdvice public class GlobalExceptionHandler { @ResponseBody @ExceptionHandler(value = ApiException.class) public CommonResult handle(ApiException e) { if (e.getErrorCode() != null) { return CommonResult.failed(e.getErrorCode()); } return CommonResult.failed(e.getMessage()); } @ResponseBody @ExceptionHandler(Exception.class) public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception { Map<String, Object> result = new HashMap<>(3); String message =exception.getMessage()+request.getRequestURL().toString(); return CommonResult.failed(message); // return result; } @ResponseBody @ExceptionHandler(value = MethodArgumentNotValidException.class) public CommonResult handleValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String message = null; if (bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); if (fieldError != null) { message = fieldError.getField()+fieldError.getDefaultMessage(); } } return CommonResult.validateFailed(message); } }
今天主要講解了@ControllerAdvice+@ExceptionHandler進行統一的在Controller層上的全域性例外處理。
到此這篇關於SpringBoot實現全域性例外處理方法總結的文章就介紹到這了,更多相關SpringBoot全域性例外處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45