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

标签 spring-mvc exception

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

关于spring-mvc - 在 Spring 中而不是 Servlet 容器中处理 ServletRequestBindingException 等异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309620/

相关文章:

java - 你如何从 Spring MVC 中的 Controller 内部获取 Jsp PageContext?

jquery - "The state information is invalid for this page and might be corrupted"

java - 代理人。思考过程。我怎样才能杀死他们?

windows - C++/CX 捕获异常 - 如何打印完整堆栈?

java - 实现 Spring Controller 的单元测试时缺少依赖项 hasSize() 和 hasProperty()

java - 使用 spring security 进行身份验证 - 预身份验证场景

java - ClassNotFoundException FreeMarkerConfigurationFactory

Spring MockMvc 和 @AutoConfigureMockMvc() 在请求中设置 header

python - Django Model.objects.create() 数据库异常不过滤

python - 引发异常与打印?