[英]How to handle exception thrown from ExceptionHandler in controller with ExceptionHandler in ControllerAdvice?
[英]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.