一、@ControllerAdvice註解
在Spring Boot開發中,開發人員通常需要在代碼中對異常進行處理。可以使用@ControllerAdvice註解定義一個類,該類中可以定義多個@ExceptionHandler註解方法來實現對全局異常的處理。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Map handleException(Exception e){ Map map = new HashMap(); map.put("code","500"); map.put("message",e.getMessage()); return map; } }
使用@ControllerAdvice註解定義的異常處理類,其中使用@ExceptionHandler註解標註的方法可以捕捉到對應的異常類型並進行處理。在上面的例子中,handleException方法捕捉到了Exception類型的異常,並返回了一個Map對象,其中包含了異常的狀態碼和錯誤信息。
二、@RestControllerAdvice註解
@RestControllerAdvice註解與@ControllerAdvice註解類似,但是在返回值類型上有所不同。使用@RestControllerAdvice註解定義的異常處理類,其中使用@ExceptionHandler註解標註的方法返回值為Object類型。以下是一個使用@RestControllerAdvice註解的異常處理類的例子:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public Object handleException(Exception e){ Map map = new HashMap(); map.put("code","500"); map.put("message",e.getMessage()); return map; } }
在這個例子中,handleException方法的返回值為Object類型。在方法中,定義了返回值為Map類型的變數map,序列化後返回該變數。
三、@ExceptionHandler註解
除了在@ControllerAdvice或@RestControllerAdvice註解標註的類中使用@ExceptionHandler註解處理異常外,在Controller中也可以使用該註解來處理局部異常。以下是一個Controller中使用@ExceptionHandler註解處理異常的例子:
@RestController @RequestMapping("/demo") public class DemoController { @ExceptionHandler(value = Exception.class) public Map handleException(Exception e){ Map map = new HashMap(); map.put("code","500"); map.put("message",e.getMessage()); return map; } @GetMapping("/{id}") public Map getDemoById(@PathVariable int id){ // 模擬獲取實體對象的過程 if(id == 1){ throw new RuntimeException("ID不能為1"); } Map map = new HashMap(); map.put("id",id); map.put("name","demo"); return map; } }
在上面的例子中,當Controller的getDemoById方法執行時,如果拋出了RuntimeException異常,handleException方法就會被調用並返回一個Map對象。如果沒有拋出異常,則正常返回實體對象。
四、@ResponseStatus註解
@ResponseStatus註解可以用來定義異常的HTTP響應狀態碼和自定義的異常消息。在Spring Boot開發中,我們可以使用該註解來管理相同類型的異常,並為它們指定相同的HTTP響應狀態碼和自定義異常信息。以下是一個使用@ResponseStatus註解的例子:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden") public class ForbiddenException extends RuntimeException { }
在上面的例子中,定義了一個ForbiddenException類,並使用@ResponseStatus註解為該異常定義了返回狀態碼為403,錯誤信息為”Forbidden”。
五、結合自定義異常使用
在開發中,我們經常會使用自定義異常來處理業務中的異常情況。這個時候,結合上面介紹的註解進行全局異常處理會更加方便。以下是一個使用自定義異常和全局異常處理註解的例子:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden") public class ForbiddenException extends RuntimeException { } @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = ForbiddenException.class) public Map handleForbiddenException(ForbiddenException e){ Map map = new HashMap(); map.put("code","403"); map.put("message",e.getMessage()); return map; } @ExceptionHandler(value = Exception.class) public Map handleException(Exception e){ Map map = new HashMap(); map.put("code","500"); map.put("message",e.getMessage()); return map; } } @RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/{id}") public Map getDemoById(@PathVariable int id){ // 模擬獲取實體對象的過程 if(id == 1){ throw new ForbiddenException(); } Map map = new HashMap(); map.put("id",id); map.put("name","demo"); return map; } }
在上面的例子中,定義了一個自定義異常ForbiddenException,並使用@ResponseStatus註解為該異常定義了返回狀態碼為403和錯誤信息為”Forbidden”。在全局異常處理註解中,分別使用@ExceptionHandler註解處理ForbiddenException和Exception兩個異常類型,並分別返回了對應的Map對象。在Controller中,如果拋出了ForbiddenException異常,handleForbiddenException方法就會被調用並返回一個Map對象,如果拋出了其他類型的異常,則調用handleException方法返回Map對象。
六、總結
在Spring Boot開發中,合理使用全局異常處理註解可以避免在代碼中出現大量的重複代碼。在定義註解時,需注意註解的使用範圍和返回值類型。結合自定義異常使用,可更好地管理代碼異常情況。
原創文章,作者:BIBJF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330580.html