rest - 如何处理来自 REST 的多种类型的异常
问题描述
我有一个可以引发多种异常的 REST 资源。为了在发生异常时检索漂亮的响应,我执行了以下操作:
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleError(Exception ae) {
return new ResponseEntity<String>(ae.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
但是从clinet方面我无法识别抛出了什么类型的异常!我有一些带有预期异常的 Junit,并且测试用例因此在不同的模式下失败。
我可以为错误添加一个新类,其中将包含异常名称:ae.getClass().getSimpleName(),以及消息并将其作为响应返回。
有没有更清洁的方法?
解决方案
要处理多种异常类型,您可以查看Spring MVC 在 ResponseEntityExceptionHandler
类中的作用。它处理多个Exception
s 并使用 . 检查它们的类型instanceof
。
但是从客户端我无法识别抛出了什么类型的异常!
我可以为其添加一个新类,该类
Error
将包含异常名称:ae.getClass().getSimpleName()
和消息并将其作为响应返回。
您应该避免将此信息泄露给客户。如果重构代码并重命名异常类会怎样?您将破坏客户端代码。
相反,您应该将异常转换为客户端可以解析的内容(当然,还要正确记录它)。
例如,考虑一个OutOfCreditException
(为此示例而编造的)来表示客户的帐户没有足够的信用来进行购买。它可以转换为以下有效负载,客户端可以轻松解析该有效负载:
{
"error": "out-of-credit",
"title": "You do not have enough credit",
"details": "Your current balance is €10, but the items cost €50",
"balance": 10,
"currency": "EUR"
}
对于报告基于 HTTP 的 API 中的问题,还可以考虑查看 [RFC 7807][4]:它定义了一种简单的 JSON 文档格式,用于表示问题以及application/problem+json
媒体类型。
推荐阅读
- c# - 如何使用c#检查aws step函数活动是否完成?
- awk - 将一个文件的第 1 列与第 2 文件的所有列合并
- c - Mariadb c 连接器 mysql_real_connect 失败错误(2002)[HY000]“无法通过套接字'/tmp/mysql.sock'(2)连接到本地 MySQL 服务器”
- c - 在针对大量数字进行测试时,C 语言模数未显示正确答案
- amazon-web-services - AWS Kinesis Stream - 每条记录都与不同的日志组相关?
- javascript - 在 JavaScript 前面的单个日期中添加零
- docker-compose - 来自不同挂载点的相同值
- python - 通过 MetaTrader5 python 模块发送订单开仓,没有任何反应
- java - 从带有偏移值的日期获取时区信息
- wordpress - Wordpress - 如何摆脱同一文件的重复项?(GTmetrix测试报告)