簡體   English   中英

Spring 引導:無法在 @ControllerAdvice 中捕獲異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM