O HttpMediaTypeNotAcceptableException no Spring MVC

O HttpMediaTypeNotAcceptableException no Spring MVC

1. Visão geral

Neste artigo rápido, veremos a exceçãoHttpMediaTypeNotAcceptableException e entenderemos os casos em que podemos encontrá-la.

2. O problema

Ao implementar um endpoint de API com Spring, geralmente precisamos especificar os tipos de mídia consumidos / produzidos (por meio dos parâmetrosconsumeseproduces). Isso restringe os possíveis formatos que a API retornará ao cliente para essa operação específica.

O HTTP também tem o cabeçalho dedicado“Accept” - que é usado para especificar os tipos de mídia que o cliente reconhece e pode aceitar. Simplificando, o servidor retornará uma representação de recurso usando um dos tipos de mídia solicitados pelo cliente.

No entanto, se não houver um tipo comum com o qual ambos os lados possam trabalhar, o Spring lançará a exceçãoHttpMediaTypeNotAcceptableException.

3. Exemplo Prático

Vamos criar um exemplo simples que demonstrará esse cenário.

Vamos usar um endpoint POST - que só pode funcionar com“application/json _ “_ e também retorna dados JSON:

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

Então, vamos enviar uma solicitação usando CURL com um tipo de conteúdo não reconhecido:

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

A resposta que obtivemos é:

< HTTP/1.1 406
< Content-Length: 0

4. A solução

Só há uma maneira de resolver o problema - enviar / receber um dos tipos suportados.

Tudo o que podemos fazer é fornecer uma mensagem mais descritiva (por padrão, o Spring retorna um corpo vazio) com umExceptionHandler personalizado notificando um cliente sobre todos os tipos de mídia aceitáveis.

Em nosso caso, é apenas“application/json”:

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

5. Conclusão

Neste tutorial, consideramos a exceçãoHttpMediaTypeNotAcceptableException lançada pelo Spring MVC quando há uma incompatibilidade entre o que o cliente pede e o que o servidor pode realmente produzir.

Como sempre, os trechos de código mencionados no artigo podem ser encontrados emour GitHub repository.