HttpMediaTypeNotAcceptableException для ошибок с ответом на текст/обычный ответ?
У меня есть простой веб-сервис, который возвращает контент как 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
. Настолько ясно, что рендеринг моего пользовательского исключения терпит неудачу, но почему?
Ответы
Ответ 1
Условие, записанное в "производит", определяет тип носителя, который будет использоваться для ответа как "text/csv". Так что для сценария успеха он отлично работает **
но когда вы идете на предоставление исключения с телом JSON, которое становится проблемой и вместо этого дает вам 406.
**