猿问

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

我的问题应该很简单。


我有一个 Spring Boot REST API。


@GetMapping("/customer")

public Customer getCustomer() {

    return service.getCustomer()

}

我的控制器返回List<Customer>并运行良好。但现在我想返回另一个对象,其中包含在收集客户时可能发生的错误。假设它被称为GenericErrorClass


所以要返回这个,我需要创建一个将 List 和 GenericErrorClass 分组的类并返回该类,对吗?


这会起作用,但现在我有Account, Product, 等等......我不认为它可以为每个人创建一个类。


如何在不创建类的情况下构建自定义对象并将其作为 json 从其余控制器返回?


繁花不似锦
浏览 106回答 3
3回答

精慕HU

不要那样做。抛出你的异常,或者让它从你的调用堆栈中逃逸。使用@ControllerAdvice(or&nbsp;@RestControllerAdvice) with@ExceptionHandler代替。您可以扩展抽象类ResponseEntityExceptionHandler,并提供额外的处理方法。从长远来看,这对于干净的应用程序设计很重要。如果您打算返回带有状态码的错误200,我想了解原因。我目睹了开发人员为错误请求提供响应,200只是因为在客户端的另一个代码分支中处理 HTTP 错误似乎“困难”。

繁华开满天机

一般在请求不成功时会返回错误信息,与 4/5xx 错误码一致。通常使用 Spring,您可以使用异常处理程序来管理这种情况,如此处所示,您可以在其中定义不同的响应主体。还有一个很好的做法:使用信封管理所有回复,我给你举个例子{&nbsp; &nbsp;status: 200,&nbsp; &nbsp;message: 'user retrieved',&nbsp; &nbsp;result:&nbsp; &nbsp;[&nbsp; &nbsp; &nbsp; {foo1:"bar1"},&nbsp; &nbsp; &nbsp; .....&nbsp; &nbsp;]}或者{&nbsp; &nbsp;status: 400,&nbsp; &nbsp;message: 'bad request',&nbsp; &nbsp;error:&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp;reason : "wrong field xxx in request"&nbsp; &nbsp;}}通过这种方式,客户端可以处理请求并向用户提供有用的信息。为此,您必须定义一个用于所有响应的类,并且应该封装结果或错误

暮色呼如

首先,您应该知道已经有一个类似的类 org.springframework.http.ResponseEntity,您可以返回该对象作为 API 的响应。它可以包装您的响应正文 - 列表、帐户、产品等,并有可能覆盖默认的 Http 状态。因此,基于此示例,您可以编写自己的简单包装类,如下所示:public class Response<T>{&nbsp; private GenericErrorClass error;&nbsp; private T body;&nbsp; // constructors + getters + setters}当您的 API 方法应该返回时,List<Customer>您将返回Response<List<Customer>>,以同样的方式返回其他对象。但是,我建议您捕获异常并将详细的错误消息 + 相应的错误代码发送到 API 客户端。从设计的角度来看,这要好得多。在这里实现这一点是一个很好的阅读。如果您有时间考虑 API 的设计,我会推荐本指南。
随时随地看视频慕课网APP

相关分类

Java
我要回答