一尘不染

Spring Boot REST服务异常处理

java

我正在尝试建立一个大型的REST服务服务器。我们正在使用Spring Boot 1.2.1,Spring 4.1.5和Java8。我们的控制器正在实现@RestController和标准的@RequestMapping注释。

我的问题是Spring Boot为控制器异常设置了默认重定向到/error。从文档:

Spring Boot默认提供一个/ error映射,以一种明智的方式处理所有错误,并且在servlet容器中注册为“全局”错误页面。

对使用Node.js编写REST应用程序已有多年的经验,对我而言,这是明智之举。服务端点生成的任何异常都应在响应中返回。我不明白为什么你要发送重定向到最有可能是Angular或JQuery SPA使用者的重定向程序,该使用者仅在寻找答案并且不能或不会对重定向采取任何措施。

我想做的是设置一个可以接受任何异常的全局错误处理程序-有目的地从请求映射方法抛出,或者由Spring自动生成(如果未为请求路径签名找到处理程序方法,则为404),然后返回标准格式的错误响应(400、500、503、404)到客户端,而无需任何MVC重定向。具体来说,我们将处理错误,使用UUID将其记录到NoSQL,然后将正确的HTTP错误代码与JSON正文中的日志条目的UUID返回给客户端。

文档对如何执行此操作一直含糊不清。在我看来,你必须创建自己的ErrorController实现或以某种方式使用ControllerAdvice,但是我所看到的所有示例仍然包括将响应转发到某种错误映射,这没有帮助。其他示例建议你必须列出要处理的每个Exception类型,而不是仅列出“ Throwable”并获取所有内容。

谁能告诉我我错过了什么,或者在没有暗示Node.js更易于处理的前提下为我指明正确的方向?


阅读 408

收藏
2020-03-18

共1个答案

一尘不染

新答案(2016-04-20)

使用Spring Boot 1.3.1.RELEASE

新的第1步-将以下属性添加到application.properties很容易且不那么麻烦:

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

比修改现有的DispatcherServlet实例(如下所示)要容易得多!-JO’

如果使用完整的RESTful应用程序,则禁用静态资源的自动映射非常重要,因为如果你使用Spring Boot的默认配置来处理静态资源,则资源处理程序将处理请求(该请求最后排序并映射到/ **,这意味着它会拾取应用程序中其他任何处理程序未处理的任何请求),因此调度程序Servlet不会有机会引发异常。

2020-03-18