Рубрики
Без рубрики

Исключение HttpMediaTypeNotAcceptableException в Spring MVC

Узнайте, как справиться с исключением HttpMediaTypeNotAcceptableException весной.

Автор оригинала: baeldung.

1. Обзор

В этой краткой статье мы рассмотрим исключение HttpMediaTypeNotAcceptableException и разберемся в случаях, когда мы можем с ним столкнуться.

2. Проблема

При реализации конечной точки API с Spring нам обычно необходимо указать типы потребляемых/производимых носителей (с помощью параметров потребляет и производит ). Это сужает возможные форматы, которые API вернет клиенту для этой конкретной операции.

HTTP также имеет выделенный заголовок “Accept” , который используется для указания типов носителей, которые клиент распознает и может принять. Проще говоря, сервер отправит обратно представление ресурсов, используя один из типов носителей, запрошенных клиентом.

Однако, если нет общего типа, с которым могут работать обе стороны, Spring выбросит HttpMediaTypeNotAcceptableException исключение.

3. Практический Пример

Давайте создадим простой пример, который продемонстрирует этот сценарий.

Мы собираемся использовать конечную точку POST, которая может работать только с “application/ json и также возвращает данные JSON:

@PostMapping(
  value = "/test", 
  consumes = MediaType.APPLICATION_JSON_VALUE, 
  produces = MediaType.APPLICATION_JSON_VALUE)
public Map example() {
    return Collections.singletonMap("key", "value");
}

Затем давайте отправим запрос с помощью CURL с непризнанным типом контента:

curl -X POST --header "Accept: application/pdf" http://localhost:8080/test -v

> POST /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.51.0
> Accept: application/pdf

Ответ, который мы получили, таков::

< HTTP/1.1 406 
< Content-Length: 0

4. Решение

Есть только один способ решить эту проблему – отправить/получить один из поддерживаемых типов.

Все, что мы можем сделать, это предоставить более описательное сообщение (по умолчанию Spring возвращает пустое тело) с пользовательским ExceptionHandler , уведомляющим клиента обо всех приемлемых типах носителей.

В нашем случае это только “приложение/json” :

@ResponseBody
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public String handleHttpMediaTypeNotAcceptableException() {
    return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
}

5. Заключение

В этом уроке мы рассмотрели исключение HttpMediaTypeNotAcceptableException , создаваемое Spring MVC, когда существует несоответствие между тем, что запрашивает клиент, и тем, что на самом деле может произвести сервер.

Как всегда, фрагменты кода, упомянутые в статье, можно найти в нашем репозитории GitHub .