The HttpMediaTypeNotAcceptableException in Spring MVC

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.

As always, the code snippets mentioned in the article can be found in our GitHub repository.

Related posts:

The DAO with JPA and Spring
Spring Autowiring of Generic Types
Form Validation with AngularJS and Spring MVC
Java – InputStream to Reader
Java Program to Implement Weight Balanced Tree
Introduction to Spring Cloud Rest Client with Netflix Ribbon
Java Program to Implement Miller Rabin Primality Test Algorithm
Java Program to Implement Hash Tables Chaining with Binary Trees
Java Program to Perform Addition Operation Using Bitwise Operators
Retrieve User Information in Spring Security
Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?
Chuyển đổi Array sang ArrayList và ngược lại
Testing an OAuth Secured API with Spring MVC
Java – String to Reader
Java Program to Find Transitive Closure of a Graph
Map Interface trong java
Java Program to Apply DFS to Perform the Topological Sorting of a Directed Acyclic Graph
Hướng dẫn Java Design Pattern – Facade
Java Program to Generate Randomized Sequence of Given Range of Numbers
TreeSet và sử dụng Comparable, Comparator trong java
Java Program to Implement Gift Wrapping Algorithm in Two Dimensions
New Features in Java 14
Java Program to Generate Random Partition out of a Given Set of Numbers or Characters
Java Program to Perform Inorder Non-Recursive Traversal of a Given Binary Tree
Java Program to Implement Bit Array
Spring Cloud AWS – RDS
Guide to Escaping Characters in Java RegExps
Java Program to Find All Pairs Shortest Path
Java Program to Construct K-D Tree for 2 Dimensional Data
Jackson Annotation Examples
Hướng dẫn Java Design Pattern – Command
Validate email address exists or not by Java Code