Изключението HttpMediaTypeNotAcceptableException в Spring MVC

1. Общ преглед

В тази бърза статия ще разгледаме изключението HttpMediaTypeNotAcceptableException и ще разберем случаите, в които бихме могли да го срещнем.

2. Проблемът

Когато внедряваме крайна точка на API с Spring, обикновено трябва да посочим консумираните / произведени типове медии (чрез консумира и създава параметри). Това стеснява възможните формати, които API ще върне обратно на клиента за тази конкретна операция.

HTTP също има специален заглавие „Приемам“ - който се използва за определяне на типове медии, които клиентът разпознава и може да приеме. Най-просто казано, сървърът ще изпрати обратно представяне на ресурс, използвайки един от типовете медии, които клиентът е поискал.

Ако обаче няма общ тип, с който и двете страни могат да работят, 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" //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, уведомяващ клиент за всички приемливи типове медии.

В нашия случай това е само „application / json“ :

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

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

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

Както винаги, кодовите фрагменти, споменати в статията, могат да бъдат намерени в нашето хранилище на GitHub.