在工作中,我们使用java spring后端和vue前端构建了一个web应用程序。目前,我们使用2或3个http响应代码在前端和后端之间传递错误。如果使用错误的参数调用和终结点,您将得到一个BAD_REQUEST。如果在后端(与参数无关)抛出一些异常,后端将返回一个INTERNAL_SERVER_ERROR,如果您传递一些不在数据库中的in,后端将返回一个NOT_FOUND。
此方法存在多个问题:
我已经找到了:https://www.baeldung.com/spring-response-status-exception,我们可以使用message字段传递有关错误的详细信息(消息字段中的特定错误json )。这是个好主意吗
意见?
T
发布于 2022-03-02 11:40:18
当然,您可以在这个字段中传递信息,但是可以使用ResponseStatusException
。取决于前端需要多少信息(例如,如果它只是向用户显示一条用户友好的消息),这可能就足够满足您的需要了。
另一种方法,如果您想在响应中使用自定义对象(尤指。每个异常/响应代码),使用@ControllerAdvice
和扩展ResponseEntityExceptionHandler
。
例如,假设您有一个自定义异常ExternalServiceUnavailableException
,其中包含一些可以从中检索的底层ServiceInformation
。然后你就可以做一些事情
public class ServiceInformation {
private final String name;
private final String status;
private final String statusMessage;
//snip
}
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ ExternalServiceUnavailableException.class })
public ResponseEntity<Object> handleExternalServiceUnavailable(ExternalServiceUnavailableException ex, WebRequest request) {
final ServiceInformation si = ex.getServiceInformation();
return ResponseEntity
.status(503) // or whatever code you want
.body(si); // or map to some other object/format
// or use the constructor to supply headers etc.
}
}
当您抛出一个ExternalServiceUnavailableException
时,会产生一个响应体,如
{
"name": "my-external-service",
"status": "timeout",
"statusMessage": "Service timed out after 30 seconds"
}
在下面的文章中可以找到一个更完整的示例,其中对每个后果异常和默认处理程序都使用相同的自定义错误对象。
https://www.baeldung.com/exception-handling-for-rest-with-spring
这使得前端更容易解释(就像您建议的方法一样),因为只有一种格式可供期待和解析,但您可以在每个异常中自由地返回不同的响应形状。
编辑:值得记住的是,还有响应代码502 (坏网关)和504 (网关超时),它们可以用来指示外部服务不可用或超时。如果这些都是适当的,您只需使用适当的ResponseStatusExceptions
,并设置一条消息来包含服务名称(或其他信息)。如前所述,这取决于您需要/希望正面接收什么。
https://stackoverflow.com/questions/71320594
复制相似问题