📖 Scenario: You are building a simple Spring Boot REST API that returns user information. Different clients may want the data in JSON or XML format.Content type negotiation allows the server to send the response in the format the client prefers.
🎯 Goal: Create a Spring Boot controller that returns user data and supports content type negotiation for JSON and XML.
📋 What You'll Learn
Create a User class with id and name fields
Create a REST controller with a GET endpoint /user
Configure the controller to return the User object
Enable content type negotiation so the response can be JSON or XML based on client request
💡 Why This Matters
🌍 Real World
APIs often need to serve different clients that prefer different data formats like JSON or XML. Content type negotiation makes your API flexible and user-friendly.
💼 Career
Understanding content type negotiation is essential for backend developers building RESTful services that interact with diverse clients.
Progress0 / 4 steps
1
Create the User class
Create a public class called User with two private fields: int id and String name. Add a public constructor that takes int id and String name as parameters and sets the fields.
Spring Boot
Hint
Think of User as a simple box holding an id and a name. You need a constructor to put values inside.
2
Create the REST controller
Create a class called UserController annotated with @RestController. Add a method getUser annotated with @GetMapping("/user") that returns a new User object with id 1 and name "Alice".
Spring Boot
Hint
Use @RestController to make the class a REST API controller. The @GetMapping("/user") marks the method as the GET endpoint.
3
Enable content type negotiation
Add the @RequestMapping(produces = {"application/json", "application/xml"}) annotation to the UserController class to allow the endpoint to produce both JSON and XML responses.
Spring Boot
Hint
The @RequestMapping annotation with produces tells Spring Boot to support these response types.
4
Add XML support dependency
Add the spring-boot-starter-web and jackson-dataformat-xml dependencies to your pom.xml or build.gradle to enable XML serialization support in Spring Boot.
Spring Boot
Hint
Spring Boot needs the XML data format library to convert objects to XML.
Practice
(1/5)
1. What is the main purpose of content type negotiation in Spring Boot?
easy
A. To send data in the format the client prefers
B. To secure the application from unauthorized access
C. To speed up database queries
D. To manage user sessions automatically
Solution
Step 1: Understand content type negotiation concept
Content type negotiation allows the server to send data in different formats like JSON or XML based on what the client requests.
Step 2: Identify the main purpose in Spring Boot
Spring Boot uses content type negotiation to automatically choose the response format that matches the client's preference.
Final Answer:
To send data in the format the client prefers -> Option A
Quick Check:
Content type negotiation = send preferred format [OK]
Hint: Remember: negotiation means choosing the client's format [OK]
Common Mistakes:
Confusing content type negotiation with security features
Thinking it speeds up database queries
Assuming it manages user sessions
2. Which of the following is the correct way to specify JSON response in a Spring Boot controller method?
easy
A. @GetMapping(value = "/data", consumes = "application/json")
B. @GetMapping(value = "/data", produces = "application/json")
C. @PostMapping(value = "/data", produces = "text/html")
D. @RequestMapping(value = "/data", method = GET, consumes = "text/plain")
Solution
Step 1: Understand 'produces' vs 'consumes'
'produces' defines the response content type; 'consumes' defines the request content type.
Step 2: Identify correct annotation for JSON response
@GetMapping with produces = "application/json" tells Spring Boot to send JSON data in response.
Final Answer:
@GetMapping(value = "/data", produces = "application/json") -> Option B
Quick Check:
produces = JSON means response is JSON [OK]
Hint: Use 'produces' to set response format [OK]
Common Mistakes:
Mixing 'consumes' with response content type
Using wrong HTTP method annotation
Setting produces to unrelated content types
3. Given this Spring Boot controller method:
@GetMapping(value = "/info", produces = {"application/json", "application/xml"})
public Data getInfo() {
return new Data("Spring", 5);
}
What will happen if the client sends an HTTP Accept header with value application/xml?
medium
A. The server responds with JSON format
B. The server ignores the Accept header and sends plain text
C. The server returns a 406 Not Acceptable error
D. The server responds with XML format
Solution
Step 1: Check the produces attribute
The method supports both JSON and XML response formats as per the produces array.
Step 2: Match client Accept header with produces
The client requests 'application/xml', which is supported, so Spring Boot will respond with XML.
Final Answer:
The server responds with XML format -> Option D
Quick Check:
Accept header matches produces = XML response [OK]
Hint: Response matches Accept header if supported [OK]
Common Mistakes:
Assuming JSON is always returned
Thinking 406 error occurs if multiple produces are set
Ignoring the Accept header
4. Consider this Spring Boot configuration snippet:
What is the likely problem if a client requests /api/data?format=txt?
medium
A. The server will throw an error due to unknown format
B. The server will respond with XML format
C. The server will respond with JSON as default
D. The server will ignore the format parameter and respond with plain text
Solution
Step 1: Analyze configured media types
Only 'json' and 'xml' are mapped to media types; 'txt' is not recognized.
Step 2: Check default content type behavior
If the parameter value is unknown, Spring Boot falls back to the default content type, which is JSON here.
Final Answer:
The server will respond with JSON as default -> Option C
Quick Check:
Unknown format uses default JSON [OK]
Hint: Unknown format falls back to default content type [OK]
Common Mistakes:
Expecting an error for unknown format
Assuming XML is default
Thinking plain text is sent automatically
5. You want to customize content negotiation in Spring Boot so that clients can request response format via URL parameter ?type= instead of the default ?format=. Which code snippet correctly achieves this?
hard
A. configurer.favorParameter(true).parameterName("type").defaultContentType(MediaType.APPLICATION_JSON);
B. configurer.favorParameter(false).parameterName("type").defaultContentType(MediaType.APPLICATION_JSON);
C. configurer.favorParameter(true).parameterName("format").defaultContentType(MediaType.APPLICATION_XML);
D. configurer.favorParameter(true).parameterName("type").defaultContentType(MediaType.TEXT_PLAIN);