Настройте код ответа об ошибке Spring Boot, не изменяя тело по умолчанию - PullRequest
0 голосов
/ 25 апреля 2020

Spring Boot по умолчанию возвращает тело ответа для исключений, которое отвечает моим потребностям, из коробки:

{
    "timestamp": 1587794161453,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "javax.persistence.EntityNotFoundException",
    "message": "No resource exists for the given ID",
    "path": "/my-resource/1"
}

Однако я хотел бы настроить код ответа для различных типов исключений, выданных моим приложением , Некоторые из исключений не принадлежат мне, поэтому я не могу просто прикрепить аннотацию @ResponseStatus к классу исключений. Я пытаюсь использовать метод @ExceptionHandler с @ResponseStatus, но это перезаписывает тело ответа, чего не произойдет sh. Например, я хотел бы отобразить javax.persistence.EntityNotFoundException для возврата кода состояния 404.

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handleEntityNotFoundException(EntityNotFoundException e) {
    // This method returns an empty response body
}

Этот вопрос похож на мой, но он также пытается настроить тело ответа. Я надеюсь, что есть более короткий и более идиоматический способ настройки только кода состояния, а не тела.

1 Ответ

0 голосов
/ 25 апреля 2020

Оказывается, что этот ответ на вопрос, который я упомянул, имел точное решение, необходимое для решения этой проблемы, хотя и не вполне заданный вопрос. Хитрость была в том, чтобы отказаться от использования @ResponseStatus из метода и вручную установить статус на HttpServletResponse, используя HttpServletResponse.sendError(). Это служит стандартным ответом об исключении Spring Boot, но с обновленным кодом состояния.

@ExceptionHandler
public void handleEntityNotFoundException(EntityNotFoundException e, HttpServletResponse response) throws IOException {
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
{
    "timestamp": 1587794161453,
    "status": 404,
    "error": "Not Found",
    "exception": "javax.persistence.EntityNotFoundException",
    "message": "No resource exists for the given ID",
    "path": "/my-resource/1"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...