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

2022-08-31 11:00:33

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

Success并且是我用来表示成功和错误响应的2个类。Error


答案 1

我建议使用Spring来处理错误。阅读本指南以获取良好的介绍,从名为“Spring Boot错误处理”的部分开始。为了进行深入讨论,Spring.io 博客中有一篇文章于2018年4月更新。@ControllerAdvice

关于其工作原理的简要摘要:

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

使用此方法,只需在一个位置为 API 中的所有终结点实现控制器异常处理。它还使 API 能够轻松地在所有终结点上具有统一的异常响应结构。这简化了客户端的异常处理。


答案 2

您可以返回要返回的泛型通配符,并在同一请求上映射方法<?>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 诺曼的答案是正确的方法