为了账号安全,请及时绑定邮箱和手机立即绑定

在 Spring Boot 中创建一个通用错误对象以指示数据检索的部分成功

在 Spring Boot 中创建一个通用错误对象以指示数据检索的部分成功

繁花不似锦 2022-06-30 18:29:01
我的问题应该很简单。我有一个 Spring Boot REST API。@GetMapping("/customer")public Customer getCustomer() {    return service.getCustomer()}我的控制器返回List<Customer>并运行良好。但现在我想返回另一个对象,其中包含在收集客户时可能发生的错误。假设它被称为GenericErrorClass所以要返回这个,我需要创建一个将 List 和 GenericErrorClass 分组的类并返回该类,对吗?这会起作用,但现在我有Account, Product, 等等......我不认为它可以为每个人创建一个类。如何在不创建类的情况下构建自定义对象并将其作为 json 从其余控制器返回?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

不要那样做。
抛出你的异常,或者让它从你的调用堆栈中逃逸。使用@ControllerAdvice(or @RestControllerAdvice) with@ExceptionHandler代替。

您可以扩展抽象类ResponseEntityExceptionHandler,并提供额外的处理方法。从长远来看,这对于干净的应用程序设计很重要。

如果您打算返回带有状态码的错误200,我想了解原因。我目睹了开发人员为错误请求提供响应,200只是因为在客户端的另一个代码分支中处理 HTTP 错误似乎“困难”。


查看完整回答
反对 回复 2022-06-30
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

一般在请求不成功时会返回错误信息,与 4/5xx 错误码一致。通常使用 Spring,您可以使用异常处理程序来管理这种情况,如此处所示,您可以在其中定义不同的响应主体。还有一个很好的做法:使用信封管理所有回复,我给你举个例子


{

   status: 200,

   message: 'user retrieved',

   result:

   [

      {foo1:"bar1"},

      .....

   ]

}

或者


{

   status: 400,

   message: 'bad request',

   error:

   {

     reason : "wrong field xxx in request"

   }

}

通过这种方式,客户端可以处理请求并向用户提供有用的信息。为此,您必须定义一个用于所有响应的类,并且应该封装结果或错误


查看完整回答
反对 回复 2022-06-30
?
暮色呼如

TA贡献1853条经验 获得超9个赞

首先,您应该知道已经有一个类似的类 org.springframework.http.ResponseEntity,您可以返回该对象作为 API 的响应。它可以包装您的响应正文 - 列表、帐户、产品等,并有可能覆盖默认的 Http 状态。


因此,基于此示例,您可以编写自己的简单包装类,如下所示:


public class Response<T>

{

  private GenericErrorClass error;

  private T body;


  // constructors + getters + setters

}

当您的 API 方法应该返回时,List<Customer>您将返回Response<List<Customer>>,以同样的方式返回其他对象。


但是,我建议您捕获异常并将详细的错误消息 + 相应的错误代码发送到 API 客户端。从设计的角度来看,这要好得多。在这里实现这一点是一个很好的阅读。


如果您有时间考虑 API 的设计,我会推荐本指南。


查看完整回答
反对 回复 2022-06-30
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信