У меня есть простой веб-сервис, который возвращает контент как json или как plain text (в зависимости от того, какой клиент accept HTTP-заголовок).
Проблема: если во время запроса text/plain возникает ошибка, Spring как-то возвращает 406 Not Acceptable. Что-то неправильно, потому что весна также может просто написать ошибку как простой текст ошибки и, кроме того, должна полностью сохранить статус ошибки 400:
@RestController
public class TestServlet {
@PostMapping(value = "/test", produces = {APPLICATION_JSON_VALUE, TEXT_PLAIN_VALUE, "text/csv"})
public Object post() {
throw new BadRequestException("bad req");
}
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {
public BadRequestException(String msg) {
super(msg);
}
}
Запрос POST с accept=application/json:
{
"timestamp": "2018-07-30T14:26:02",
"status": 400,
"error": "Bad Request",
"message": "bad req",
"path": "/test"
}
НО с accept=text/csv (или text/plain) показывает пустой ответ со статусом 406 Not Acceptable.
Я также заметил, что DispatcherServlet.processDispatchResult() вызывается дважды: сначала с моим исключением BadRequest, второй раз с HttpMediaTypeNotAcceptableException. Настолько ясно, что рендеринг моего пользовательского исключения терпит неудачу, но почему?