Skip to content

Lab 9: Return XML Media Type

Goal

  • Learn how to implement content-negotiation.

a. Add Failing Test

Add the following test to the CoffeeOrderWebTest:

@Test
public void getCoffeeOrderAsXmlIsOk() throws Exception {
  MvcResult mvcResult = mockMvc.perform(get("/api/coffee/order")
                                            .accept(MediaType.APPLICATION_XML))
                               .andExpect(status().isOk())
                               .andReturn();

  String xmlContent = mvcResult.getResponse().getContentAsString();
  assertThat(xmlContent)
      .contains("<CoffeeItemResponse>",
                "<id>1</id>",
                "<kind>latte</kind>",
                "<creamer>milk</creamer>",
                "<size>small</size>",
                "<price>$1</price>",
                "</CoffeeItemResponse>");
}

When you run it, it should fail. Note how it fails: what is the return status code?

b. Implement XML Support

Add the following dependency to your pom.xml file in the <dependencies> section:

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

Now run the test. What happens?

c. Produces Annotation

To force a mapped method to return a specific set of media types, you can use the produces parameter. Change the @GetMapping in the CoffeeOrderController to be:

@GetMapping(value = "/api/coffee/order", produces = MediaType.APPLICATION_JSON_VALUE)

Run the test again. What happens?


NOTE Before continuing, make sure to restore the mapping to the way it was, i.e.:

@GetMapping("/api/coffee/order")