处理Spring中的ServletRequestBindingException等异常而不是Servlet容器

Sve*_*ges 2 exception-handling spring-mvc

我使用springmvc作为REST项目,每当客户端使用错误的HTTP方法调用rest资源时,都会抛出servletrequestbindingexception.我无法在控制器中使用@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>
Run Code Online (Sandbox Code Playgroud)

我宁愿使用spring异常处理.例如,我想基于传入的Accept头创建一个动态响应,所以要么写出json或xml以获取其他例外.最好的方法是从这个处理程序返回一个自动转换为json或xml的对象,就像从处理程序返回的普通dto一样.

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

ska*_*man 6

不能使用@ExceptionHandler(因为就像你说的,这是为了应对来自抛出的异常的处理程序代码),但你仍然可以使用HandlerExceptionResolver框架来做到这一点.

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

HandlerExceptionResolver接口的默认实现,它解析标准Spring异常并将它们转换为相应的HTTP状态代码.

HTTP 405的生成实际上是HttpRequestMethodNotSupportedException通过处理程序映射代码抛出的类来处理的.

因此,如果您希望以不同方式处理此异常,则可以提供自己的实现HandlerExceptionResolver.子类化DefaultHandlerExceptionResolver和覆盖handleHttpRequestMethodNotSupported方法可能最容易,ModelAndView从那里返回.