在 Spring MVC 或 Spring-Boot 中返回不同类型的 ResponseEntity 的最佳方法是什么

新手上路,请多包涵

我使用 Spring MVC 4(或 Spring-Boot)编写了简单的 rest 应用程序。在控制器内,我返回 ResponseEntity 。但在某些情况下,我想给出成功 JSON,如果有验证错误,我想给出错误 JSON。目前成功和错误响应完全不同,所以我为错误和成功创建了 2 个类。如果内部逻辑没问题,我想在控制器内返回 ResponseEntity<Success> 。否则我想返回 ResponseEntity<Error> 。有没有办法做到这一点。

SuccessError 是我用来表示成功和错误响应的 2 个类。

原文由 Saveendra Ekanayake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 672
2 个回答

我推荐使用 Spring 的 @ControllerAdvice 来处理错误。阅读 本指南 以获得良好的介绍,从名为“Spring Boot 错误处理”的部分开始。如需深入讨论,请参阅 Spring.io 博客中 的一篇文章,该文章于 2018 年 4 月更新。

关于其工作原理的简要总结:

  • 您的控制器方法应该只返回 ResponseEntity<Success> 。它不负责返回错误或异常响应。
  • 您将实现一个处理所有控制器异常的类。这个类将用 @ControllerAdvice 注释
  • 此控制器建议类将包含用 @ExceptionHandler 注释的方法
  • 每个异常处理程序方法都将被配置为处理一种或多种异常类型。这些方法是您指定错误响应类型的地方
  • 对于您的示例,您将(在控制器建议类中)声明验证错误的异常处理程序方法。返回类型为 ResponseEntity<Error>

使用这种方法,您只需在一个地方为 API 中的所有端点实现控制器异常处理。它还使您的 API 可以轻松地在所有端点上拥有统一的异常响应结构。这简化了客户的异常处理。

原文由 Mark Norman 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以在同一请求映射方法上返回通用通配符 <?> 返回 SuccessError

 public ResponseEntity<?> method() {
    boolean b = // some logic
    if (b)
        return new ResponseEntity<Success>(HttpStatus.OK);
    else
        return new ResponseEntity<Error>(HttpStatus.CONFLICT); //appropriate error code
}

@Mark Norman 的回答是正确的方法

原文由 Saravana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题