Bird
Raised Fist0
Spring Bootframework~20 mins

Content type negotiation in Spring Boot - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Content Type Negotiation Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the response content type when client requests JSON?

Given a Spring Boot controller method annotated with @GetMapping(produces = {"application/json", "application/xml"}), what content type will the server respond with if the client sends an Accept: application/json header?

Spring Boot
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @GetMapping(value = "/data", produces = {"application/json", "application/xml"})
    public Data getData() {
        return new Data("example", 123);
    }
}

record Data(String name, int value) {}
AThe server responds with Content-Type: application/xml and XML formatted data.
BThe server responds with Content-Type: application/octet-stream and binary data.
CThe server responds with Content-Type: text/plain and plain text data.
DThe server responds with Content-Type: application/json and JSON formatted data.
Attempts:
2 left
💡 Hint

Check the Accept header and the produces attribute in the controller.

📝 Syntax
intermediate
2:00remaining
Which annotation correctly specifies multiple content types for response?

In Spring Boot, which of the following @GetMapping annotations correctly specifies that the method can produce both JSON and XML responses?

A@GetMapping(value = "/info", produces = "application/json, application/xml")
B@GetMapping(value = "/info", produces = {"application/json", "application/xml"})
C@GetMapping(value = "/info", produces = "application/json|application/xml")
D@GetMapping(value = "/info", produces = ["application/json", "application/xml"])
Attempts:
2 left
💡 Hint

Look at the correct Java array syntax for the produces attribute.

🔧 Debug
advanced
2:00remaining
Why does the server respond with 406 Not Acceptable?

A client sends a request with header Accept: application/pdf to a Spring Boot endpoint that produces application/json only. What causes the 406 error?

Spring Boot
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PdfController {
    @GetMapping(value = "/report", produces = "application/json")
    public Report getReport() {
        return new Report("Monthly", 100);
    }
}

record Report(String title, int count) {}
AThe server is down and returns 406 as a default error.
BThe server has a syntax error in the controller method causing 406.
CThe server cannot produce the requested content type application/pdf, so it returns 406 Not Acceptable.
DThe client request is missing an Authorization header, causing 406.
Attempts:
2 left
💡 Hint

Think about what 406 status means in HTTP.

❓ state_output
advanced
2:00remaining
What is the response content type if no Accept header is sent?

Consider a Spring Boot controller method annotated with @GetMapping(produces = {"application/json", "application/xml"}). If the client sends a request without an Accept header, what content type will the server respond with?

Spring Boot
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DefaultController {
    @GetMapping(value = "/default", produces = {"application/json", "application/xml"})
    public Info getInfo() {
        return new Info("default", true);
    }
}

record Info(String name, boolean active) {}
AThe server responds with Content-Type: application/json by default.
BThe server responds with Content-Type: application/xml by default.
CThe server responds with Content-Type: text/html by default.
DThe server responds with 406 Not Acceptable error.
Attempts:
2 left
💡 Hint

Think about the default content type Spring Boot uses when no Accept header is specified.

🧠 Conceptual
expert
3:00remaining
How does Spring Boot determine response content type with multiple converters?

Spring Boot has multiple HttpMessageConverters registered, including JSON and XML converters. When a controller method produces both application/json and application/xml, how does Spring Boot decide which converter to use for the response?

ASpring Boot matches the client's Accept header with the supported media types of converters and picks the best match.
BSpring Boot always uses the JSON converter if available, ignoring the Accept header.
CSpring Boot uses the first registered converter regardless of the Accept header.
DSpring Boot randomly picks a converter from the registered list.
Attempts:
2 left
💡 Hint

Consider how HTTP content negotiation works with Accept headers and converters.

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

  1. 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.
  2. 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.
  3. Final Answer:

    To send data in the format the client prefers -> Option A
  4. 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

  1. Step 1: Understand 'produces' vs 'consumes'

    'produces' defines the response content type; 'consumes' defines the request content type.
  2. Step 2: Identify correct annotation for JSON response

    @GetMapping with produces = "application/json" tells Spring Boot to send JSON data in response.
  3. Final Answer:

    @GetMapping(value = "/data", produces = "application/json") -> Option B
  4. 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

  1. Step 1: Check the produces attribute

    The method supports both JSON and XML response formats as per the produces array.
  2. Step 2: Match client Accept header with produces

    The client requests 'application/xml', which is supported, so Spring Boot will respond with XML.
  3. Final Answer:

    The server responds with XML format -> Option D
  4. 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:
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorParameter(true)
              .parameterName("format")
              .defaultContentType(MediaType.APPLICATION_JSON)
              .mediaType("xml", MediaType.APPLICATION_XML)
              .mediaType("json", MediaType.APPLICATION_JSON);
}
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

  1. Step 1: Analyze configured media types

    Only 'json' and 'xml' are mapped to media types; 'txt' is not recognized.
  2. 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.
  3. Final Answer:

    The server will respond with JSON as default -> Option C
  4. 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);

Solution

  1. Step 1: Enable parameter-based content negotiation

    Set favorParameter(true) to allow URL parameter control.
  2. Step 2: Change parameter name to 'type'

    Use parameterName("type") to listen for '?type=' instead of default '?format='.
  3. Step 3: Set default content type to JSON

    defaultContentType(MediaType.APPLICATION_JSON) ensures JSON if no parameter is given.
  4. Final Answer:

    configurer.favorParameter(true).parameterName("type").defaultContentType(MediaType.APPLICATION_JSON); -> Option A
  5. Quick Check:

    favorParameter + parameterName = custom URL param [OK]
Hint: Set favorParameter true and parameterName to customize URL param [OK]
Common Mistakes:
  • Disabling favorParameter disables URL param negotiation
  • Using wrong parameter name
  • Setting inappropriate default content type
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard