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.

**