![](/img/trans.png)
[英]@ControllerAdvice and @ExceptionHandler not getting triggered for my RestController
[英]ControllerAdvice, ExceptionHandler and try catch block in RestController
我有關於@ControllerAdvice
和@ExceptionHandler
的一般性問題。 我有一個 rest controller 注釋@RestController
有 2 個 api。 如果參數驗證失敗,則拋出MethodArgumentNotValidException
。 我創建了ExceptionHandler
來處理這個:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseEntity<String> handleException(MethodArgumentNotValidException e) throws Exception {
return new ResponseEntity<>(e.getBindingResult().getGlobalError().getDefaultMessage(), HttpStatus.BAD_REQUEST);
}
}
如果我想在發生此異常時記錄某些內容,我可以在return
語句之前添加一行代碼,例如:
LOG.info("something happened");
它會記錄它然后將 BAD_REQUEST 返回給調用者嗎?
如果我想在發生此異常時記錄某些內容,我可以在 return 語句之前添加一行代碼,例如:
LOG.info("發生了什么事");
它會記錄它然后將 BAD_REQUEST 返回給調用者嗎?
是的。 這就是使用@ExceptionHandler
的目的。 它們有助於減少處理項目中定義的多個 rest 端點的異常的代碼。 這也可以作為記錄異常的單點,從而避免這種反模式:
//BAD
class SomeService {
public SomeEntity someMethod() {
try {
/* stuff... */
} catch (Exception e) {
//No need to log the exception here
log.error("An exception happened", e);
throw e;
}
}
}
盡管如此,您仍然可以獲得一些好處,例如包裝異常並重新拋出它們:
//GOOD
class SomeService {
public SomeEntity someMethod(String param) {
try {
/* stuff... */
} catch (Exception e) {
//You may use this to perform other logic like setting specific message or wrap your exception
log.error("Unexpected behaviour with param {}", param);
throw new MyCustomException("Some message", e);
}
}
}
您可以將@ExceptionHandler
視為所有 rest 端點和特定類型異常的巨大catch
塊。
此外,您的GlobalExceptionHandler
class 成為具有相關邏輯的組件,用於處理后端拋出的每個異常並處理如何將其報告給客戶端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.