我有一个REST api spring boot应用程序,我想处理ControllerAdvice中的任何错误,因为我希望有一个自定义的响应格式,而不是使用Spring的默认响应。
例如,像RequestRejectedException这样的异常不是通过控制器通知来处理的。有没有一种优雅的方法来处理Spring的one处理程序中可能出现的错误?
对于RequestRejectedException,我实现了一个GenericFilterBean并重新格式化了响应,但我希望有一种更统一的方法来处理所有错误。
发布于 2020-07-07 17:52:37
控制器通知能够处理由控制器方法调用启动的任何流产生的任何异常。
这是"Spring MVC“处理异常的通用方法。
现在Spring MVC的基础设施在技术上是基于单个servlet (称为DispatcherServlet),它可以通过url、http方法等将控制器方法“分配”给调用。
但是,您也可以使用Servlet的过滤器,这些过滤器是由底层web容器(如tomcat或jetty)直接部署和处理的。因此,如果代码产生异常,那么它甚至不会到达MVC控制器,因此控制器通知不能拦截该异常。
您还没有指定具体是哪段代码产生了RequestRejectedException,但这可能是在spring mvc之外完成的,因此控制器建议不适用……
发布于 2020-07-07 17:34:20
对于ControllerAdvice,类似于:
@ControllerAdvice
class GenericExceptionHandling extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = RuntimeException.class)
protected ResponseEntity<Object> handleConflict(
RuntimeException ex, WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse,
new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}应该是有意义的,但由于spring抛出此异常的方式不同,所以似乎不能这样处理它。阅读related。因此,处理此问题的方法之一是使用具有最高顺序的筛选器,并在该筛选器中捕获此异常并将响应转换为您想要的响应。
相关堆栈溢出线程:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized
https://stackoverflow.com/questions/62771839
复制相似问题