Вы на правильном пути.На мой взгляд, не всегда правильно возвращать 4xx
коды ответов для всех непроверенных исключений.Я бы предпочел сопоставить определенное подмножество этих исключений с 4xx
кодами ответов, а все остальное должно быть внутренней ошибкой сервера, таким образом 500
код ответа.
@ResponseStatus(value=HttpStatus.NOT_FOUND)
public class EntityNotFoundException extends RuntimeException {
// ...
}
Это исключение может быть выдано из @Service
аннотированные классы, если сущность не найдена.Для других случаев вы также можете определить пользовательские исключения.Вы также можете придерживаться @ExceptionHandler
, но тогда вам придется выполнять сопоставление самостоятельно.
Я бы рекомендовал сопоставлять исключения с соответствующими кодами ответов HTTP:
- Неверный запрос:
400
- Не найдено:
404
- Запрещено:
403
- Внутренняя ошибка сервера:
500
Кроме того, не забудьте вернуть один из следующих (или любых других) кодов ответов, если ваш запрос был успешным.
Обычно используются вышеуказанные коды ответов.Конечно, их намного больше, но большинство API занимают лишь небольшое подмножество.При правильном сопоставлении клиентам легче узнать, что, возможно, пошло не так (или правильно), а затем они могут выполнить дальнейшие действия или отобразить необходимую клиенту информацию.Например:
200
: показать сообщение об успехе 403
: перенаправить на страницу входа 400
: показать ошибки, если формабыло отправлено
Хорошей практикой также является включение значимой информации в тело, если что-то пошло не так.Это также отвечает на вопрос: «Что мне делать, если я не могу сопоставить исключение с существующим кодом ответа?».Я задал себе тот же вопрос, и ответ прост.Попробуйте сопоставить его с ближайшим кодом ответа и включить в текст что-либо еще.
Если в клиенте отсутствует параметр, вы можете использовать следующее:
{ "error" : "Bad Request - Your request is missing parameter 'id'. Please verify and resubmit." }
Или для вышеуказанных ошибок в формах (код ответа 400
):
{
"errors": [
"username": "AlreadyInUse",
]
}
Просто убедитесь, что вы придерживаетесь одного формата при возврате информации в теле.Иначе работать с болью.