Как обработать несколько типов исключений из REST - PullRequest
0 голосов
/ 07 марта 2019

У меня есть ресурс 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);
}

Но со стороны клиники я не могу распознать, какой тип исключения был выдан! У меня есть несколько Junits с ожидаемым исключением, и тестовые случаи не выполняются из-за этого в разных режимах.

Я могу добавить новый класс для Error, который будет содержать имя исключения: ae.getClass (). GetSimpleName () и сообщение и вернуть его в ответ.

Есть ли более чистый путь?

1 Ответ

0 голосов
/ 07 марта 2019

Чтобы обработать несколько типов исключений, вы могли бы взглянуть на то, что Spring MVC делает в классе ResponseEntityExceptionHandler. Он обрабатывает количество 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"
}

Для сообщения о проблемах в API на основе HTTP также рассмотрите [RFC 7807] [4]: ​​он определяет простой формат документа JSON для представления проблем вместе с типом носителя application/problem+json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...