簡體   English   中英

處理過濾器中ExceptionHandler拋出的異常

[英]Handling an exception thrown from ExceptionHandler in a filter

我的邏輯是實現一個全局異常過濾器,該過濾器可處理Spring MVC內部的任何異常,並且還具有@ControllerAdvice處理異常

全局過濾

@Component
public class GlobalExceptionHandlerFilter extends OncePerRequestFilter {
  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    try {
      filterChain.doFilter(request, response);
    } catch (Throwable ex) {
      ...
    }
  }
}

控制器建議

@ControllerAdvice
public class BaseController {
   @ExceptionHandler(value = {ConstraintViolationException.class})
   public void handlePersistenceException(ConstraintViolationException ex, HttpServletRequest request) throws MyException {
     String str = "";

     for (ConstraintViolation constraintViolation : ex.getConstraintViolations()) {
       str += "Property '" + constraintViolation.getPropertyPath() + "' - " + constraintViolation.getMessage();
     }

     MyException myException = new MyException(str);
     throw myException;
  }
}

全局過濾器包裝了異常的執行,因此它捕獲了ConstraintViolation。 但是我的邏輯需要將ConstraintViolation修改為MyException並從ControllerAdvice中拋出它。 全局仍然捕獲ConstraintViolation,而不是從ControllerAdvice拋出的MyException,但是當我不拋出MyException時,異常不會傳遞到過濾器。

如何在ControllerAdvice中使用MyException覆蓋ConstraintViolationException以使其被globalexception過濾器捕獲。

將MyException類包裝在ResponseEntity中,並返回所需的HttpStatus。

@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<MyException> notFoundException(HttpServletRequest request,
                HttpMessageNotReadableException e) {


    MyException myException = new MyException("CustomMessage");
    logger.error("An constrain voilation occured reason {}", e);
    return new ResponseEntity<>(myException , HttpStatus.BAD_REQUEST);
}

您無法實現上述所需的方案,因為ExceptionHandler 調用程序 (ExceptionHandlerExceptionResolver.doResolveHandlerMethodException)調用與異常完全匹配的方法,該異常會從調用的方法中捕獲任何異常。

在處理程序中發生異常的情況下,此鏈中的默認操作是重新拋出調用處理程序的原始Exception。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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