Http 415 Unsupported Media type error with JSON
Categories:
Resolving HTTP 415 Unsupported Media Type Errors with JSON in Java

Understand and troubleshoot the HTTP 415 error when your Java application expects JSON but receives an incompatible media type.
The HTTP 415 Unsupported Media Type client error response code indicates that the server refuses to accept the request because the payload format is in an unsupported format. This often happens when a client sends data in a format the server doesn't expect or isn't configured to process, especially with JSON payloads in Java applications. This article will guide you through common causes and solutions for this error.
Understanding the HTTP 415 Error
The 415 status code is a clear signal from the server that it cannot process the request's Content-Type
header. When working with RESTful APIs and JSON, this typically means one of two things:
- Incorrect
Content-Type
Header: The client is sending aContent-Type
header that doesn't match what the server expects (e.g.,text/plain
instead ofapplication/json
). - Missing
Content-Type
Header: The client is not sending aContent-Type
header at all, and the server cannot infer the payload type. - Server Misconfiguration: The server-side application (e.g., a Spring Boot controller) is not correctly configured to consume JSON, or the necessary JSON processing libraries are missing.
flowchart TD A[Client Sends Request] --> B{Is 'Content-Type' Header Present?} B -- No --> C[Server Returns 415 (Missing Header)] B -- Yes --> D{Is 'Content-Type' 'application/json'?} D -- No --> E[Server Returns 415 (Incorrect Type)] D -- Yes --> F{Is Server Configured for JSON?} F -- No --> G[Server Returns 415 (Server Misconfig)] F -- Yes --> H[Server Processes Request Successfully]
Flowchart illustrating the decision points leading to an HTTP 415 error.
Common Causes and Solutions in Java Applications
Let's dive into specific scenarios and how to resolve them when developing Java-based web services, particularly with frameworks like Spring Boot.
1. Incorrect or Missing Content-Type
Header from Client
This is the most frequent cause. The server expects application/json
, but the client sends something else or nothing at all.
POST /api/resource
Host: example.com
Content-Type: text/plain
{"name": "John Doe"}
Example of an incorrect Content-Type
header causing a 415 error.
POST /api/resource
Host: example.com
{"name": "John Doe"}
Example of a missing Content-Type
header.
Content-Type
header tells the server what kind of data is in the request body. The Accept
header tells the server what kind of data the client prefers to receive in the response.Solution: Ensure Client Sends application/json
The client must explicitly set the Content-Type
header to application/json
when sending JSON data. Here's how you might do it in different contexts:
JavaScript (Fetch API)
fetch('/api/resource', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'John Doe' }) });
Java (HttpClient)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8080/api/resource"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{"name": "John Doe"}"))
.build();
HttpResponse
cURL
curl -X POST
http://localhost:8080/api/resource
-H 'Content-Type: application/json'
-d '{"name": "John Doe"}'
2. Server-Side Misconfiguration or Missing Dependencies
Even if the client sends the correct Content-Type
, the server might still return a 415 if it's not set up to handle JSON. In Java, this usually involves ensuring the correct libraries are present and your controller methods are properly annotated.
Solution: Verify Dependencies and Annotations
For Spring Boot applications, you typically need the spring-boot-starter-web
dependency, which includes Jackson (a popular JSON processing library) by default. Ensure your pom.xml
or build.gradle
includes this:
Maven (pom.xml
):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Required Maven dependency for Spring Web and JSON processing.
Also, ensure your Spring controller methods are correctly annotated to consume JSON. The @RequestBody
annotation is crucial for binding the JSON payload to a Java object.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@PostMapping("/api/resource")
public String createResource(@RequestBody MyData data) {
// Process the 'data' object
System.out.println("Received: " + data.getName());
return "Resource created successfully!";
}
}
class MyData {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// Getters and setters
}
Example Spring Boot controller method correctly consuming JSON with @RequestBody
.
ObjectMapper
or have specific JSON serialization/deserialization needs, ensure your configuration is compatible with the incoming JSON structure and the expected Java object.Troubleshooting Steps
When faced with a 415 error, follow these steps:
- Inspect Client Request: Use browser developer tools (Network tab) or a tool like Postman to verify the
Content-Type
header and the raw request body being sent. - Check Server Logs: Look for any error messages in your server-side application logs. Spring Boot often provides detailed messages about why it couldn't convert the request body.
- Verify Dependencies: Confirm that
spring-boot-starter-web
(or equivalent JSON processing libraries like Jackson if not using Spring) is correctly included in your project. - Review Controller Annotations: Ensure your controller methods use
@RequestBody
for parameters that should receive the JSON payload. - Simplify Payload: Try sending a very simple JSON object (e.g.,
{"key": "value"}
) to rule out issues with complex data structures.