我的问题应该很简单。
我有一个Spring Boot REST API。
@GetMapping("/customer")
public Customer getCustomer() {
return service.getCustomer()
}
我的控制器返回List<Customer>
,并且工作正常。但现在我想返回另一个对象,其中包含收集客户时可能发生的错误。比方说它叫做GenericErrorClass
所以要返回这个,我需要创建一个包含List和GenericErrorClass的类,然后返回那个类,对吗?
这将工作,但现在我有Account
,Product
等。我不认为这会让sence为他们每个人创建一个类。
如何在不创建类的情况下构建自定义对象,并将其作为json从rest控制器返回?
发布于 2019-02-22 03:54:06
别干那事。
抛出你的异常,或者让它从你的调用栈中逃脱。将@ControllerAdvice
(或@RestControllerAdvice
)与@ExceptionHandler
一起使用。
您可以扩展抽象类ResponseEntityExceptionHandler
,并提供其他处理方法。从长远来看,这对干净的应用程序设计很重要。
如果你打算返回一个状态码为200
的错误,我想知道为什么。我看到开发人员使用200
为错误的请求提供响应,只是因为在客户端的另一个代码分支中处理HTTP错误似乎“很难”。
发布于 2019-02-22 03:59:55
通常,当请求不成功时,您会返回错误信息,这与4/5xx错误代码一致。通常使用Spring使用异常处理程序来处理这种情况,如here所示,您可以在其中定义不同的响应体。还有另一个很好的实践:使用信封管理所有响应,我将向您展示一个示例
{
status: 200,
message: 'user retrieved',
result:
[
{foo1:"bar1"},
.....
]
}
或
{
status: 400,
message: 'bad request',
error:
{
reason : "wrong field xxx in request"
}
}
通过这种方式,客户端可以处理请求并向用户提供有用的信息。为此,您必须定义一个用于所有响应的类,并应封装结果或错误
发布于 2019-02-22 04:33:43
首先,您应该知道已经有一个类似的类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客户端。从设计的角度来看,这要好得多。实现这个here是一个很好的读物。
如果你有时间考虑你的应用编程接口的设计,我会推荐this指南。
https://stackoverflow.com/questions/54815085
复制相似问题