当前位置: 首页 > 面试题库 >

Spring Boot REST服务异常处理

齐财
2023-03-14
问题内容

我正在尝试建立一个大型的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更易于处理的前提下为我指明正确的方向?


问题答案:

新答案(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不会有机会引发异常。



 类似资料:
  • 我正在使用quarkus版本,需要知道如何处理未知endpoint。当我试图命中尚未实现的endpoint时,它只会发送,而不是我希望实现的异常。我无法找到相同的实现。有人能帮我做这个吗?

  • 我正在尝试建立一个大型的REST服务服务器。我们使用的是spring boot 1.2.1 spring 4.1.5和Java 8。我们的控制器实现了@RestController和标准的@RequestMapping注释。 我的问题是,spring boot将控制器异常设置为的默认重定向。从文档中: 默认情况下,spring boot提供了一个/error映射,它以一种合理的方式处理所有错误,并

  • 问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是

  • Java异常处理分为错误、已检查异常和未检查异常。这个问题是关于例外的。 正常的Java异常处理是扩展检查异常的异常类,并通过考虑异常层次结构来处理您需要的异常。 例如: 但是我看到了主要的Spring书籍,甚至在Spring boot中提到的Internet教程中,以及在微服务的上下文中,总是从RuntimeException类扩展而来,即使使用@ControllerAdvice。 这显然违反了

  • 我有一个WCF服务,它连接到一个服务总线队列,准备接收消息。这是工作很好,但我希望能够标记的消息作为一个死信,如果我有一个问题处理的消息。当前,如果我的代码抛出异常,消息仍然会从队列中删除,但我希望能够在配置中指定不从队列中删除,但将其标记为死信。我做了一些搜索,但我不知道怎么做。我当前正在将该服务作为windows服务运行 Uri baseAddress=ServiceBusEnvironmen

  • 因此,我在Spring Boot服务中定义了各种APIendpoint,它们抛出各种自定义异常。但我无法区分已检查和未检查的执行。 那么,我的自定义例外是要检查还是不检查? 示例: UserNotFoundException EmailAlreadyExistsException JWTTokenMalformedException 数据库NodeFailureException 这些异常由Spr