Skip to main content
 首页 » 编程设计

spring-mvc之在 Spring 中而不是 Servlet 容器中处理 ServletRequestBindingException 等异常

2024年04月17日12xiaohuochai

我正在将 springmvc 用于 REST 项目,每当客户端使用错误的 HTTP 方法调用 Rest 资源时,就会抛出 servletrequestbindingexception。我无法在 Controller 中使用 @ExceptionHandler 处理这些异常,因为它不是发生在处理程序方法中,而是发生在 spring 映射层中。

目前我声明了 web.xml 异常处理,这有效:

<error-page> 
    <exception-type>org.springframework.web.bind.ServletRequestBindingException</exception-type> 
    <location>/servletRequestBindingException.jsp</location> 
</error-page> 
<error-page> 
    <error-code>405</error-code> 
    <location>/methodNotSupported.jsp</location> 
</error-page> 

不过,我宁愿使用 spring 异常处理。例如,我想根据传入的 Accept header 创建动态响应,因此可以为剩余异常写出 json 或 xml。最好的办法是从此处理程序返回一个对象,该对象会自动转换为 json 或 xml,就像从处理程序返回的普通 dto 一样。

有没有办法捕获这些较低级别的映射异常?

请您参考如下方法:

您不能使用@ExceptionHandler(因为正如您所说,这是为了处理从处理程序代码中抛出的异常),但您仍然可以使用HandlerExceptionResolver framework来做到这一点。

默认情况下,DispatcherServlet 注册 DefaultHandlerExceptionResolver 的实例:

Default implementation of the HandlerExceptionResolver interface that resolves standard Spring exceptions and translates them to corresponding HTTP status codes.

HTTP 405 的生成实际上是在此类中处理的,方法是捕获处理程序映射代码抛出的 HttpRequestMethodNotSupportedException

因此,如果您想以不同的方式处理此异常,您可以提供您自己的 HandlerExceptionResolver 实现。最简单的方法可能是继承 DefaultHandlerExceptionResolver 并重写 handleHttpRequestMethodNotSupported 方法,从那里返回您的 ModelAndView