我有一个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);
}
但是从客户端的角度来看,我无法识别抛出了哪种异常! 我有一些带有预期异常的Junit,并且由于不同的模式,测试用例失败了。
我可以为Error添加一个新类,其中将包含异常名称:ae.getClass()。getSimpleName(),以及消息并作为响应返回。
有没有更清洁的方法?
答案 0 :(得分:0)
要处理多种异常类型,您可以have a look使用ResponseEntityExceptionHandler
类中的Spring MVC。它处理多个Exception
,并使用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
媒体类型。 / p>