![](/img/trans.png)
[英]ControllerAdvice cannot catch custom exception in Spring Boot
[英]Spring Boot: Cannot catch exception in @ControllerAdvice
我有 2 個使用@RestControllerAdvice
注釋的異常處理程序類,並且:
我使用第一個作為全局異常處理程序來捕獲異常:
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Override
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
protected ResponseEntity<Object> handleMethodArgumentNotValid(...) {
// ...
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<Object> handleAllUncaughtException(Exception ex, WebRequest request) {
// ...
}
// code omitted for clarity
}
第二個用於驗證異常(我創建自定義驗證):
@RestControllerAdvice
public class ValidationExceptionHandler { // did not extend from extends ResponseEntityExceptionHandler
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
protected ValidationErrorResponse onConstraintValidationException(ConstraintViolationException e) {
// ...
}
}
當我將onConstraintValidationException
移動到GlobalExceptionHandler
class 時,我捕獲了驗證異常並顯示相應的消息。 但是當它在第二個 ControllerAdvice class ( ValidationExceptionHandler
) 中時,代碼不會命中onConstraintValidationException
方法。
我還嘗試從ResponseEntityExceptionHandler
擴展第二個 class ,但沒有任何意義。
那么,問題是什么,我該如何解決?
在您的情況下,這可能是優先級問題......第一個異常處理程序具有最高優先級,並且可能 handleAllUncaughtException 將捕獲所有異常。
為了在第二個處理程序 (ValidationExceptionHandler) 中捕獲 ConstraintViolationException,您應該給它最高優先級,如下所示:
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ValidationExceptionHandler {
和第一個最低的:
@RestControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
可以看看這個討論,了解更多關於它是如何工作的並有一些替代解決方案可能會很有趣: 設置多個@ControllerAdvice @ExceptionHandlers 的優先級
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.