我正在将 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
。