如何从REST处理多种类型的异常

时间:2019-03-07 10:30:03

标签: rest exception

我有一个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(),以及消息并作为响应返回。

有没有更清洁的方法?

1 个答案:

答案 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>