1. Overview
In this quick article, weβll have a look at the HttpMediaTypeNotAcceptableException exception, and understand the cases where we might encounter it.
2. The Problem
When implementing an API endpoint with Spring, we generally need to specify the consumed/produced media types (via the consumes and produces parameters). This narrows down the possible formats that the API will return back to the client for that specific operation.
HTTP also has the dedicated βAcceptβ header β which is used to specify media types the client recognizes and can accept. Simply put, the server will send back a resource representation using one of the media types the client requested.
However, if there is no common type that both sides can work with, Spring will throw the HttpMediaTypeNotAcceptableException exception.
3. Practical Example
Letβs create a simple example that will demonstrate this scenario.
Weβre going to use a POST endpoint β which can only work with βapplication/jsonβ and returns JSON data back as well:
@PostMapping(
value = "/test",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, String> example() {
return Collections.singletonMap("key", "value");
}
Then, letβs send a request using CURL with a non-recognized content type:
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
The response we got is:
< HTTP/1.1 406
< Content-Length: 0
4. The Solution
Thereβs only one way to resolve the issue β to send/receive one of the supported types.
All we can do is to provide a more descriptive message (by default Spring returns an empty body) with a custom ExceptionHandler notifying a client about all acceptable media types.
In our case, itβs only βapplication/jsonβ:
@ResponseBody
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public String handleHttpMediaTypeNotAcceptableException() {
return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
}
5. Conclusion
In this tutorial, weβve considered the HttpMediaTypeNotAcceptableException exception thrown by Spring MVC when thereβs a mismatch between what the client asks for and what the server can actually produce.
