Lesson 5: Support both XML and JSON

1. Goal

Learn the basics of Content Negotiation and enable XML support for the API in Spring (starting with Spring 4.1).

2. Lesson Notes

The relevant module you need to import when you're starting with this lesson is: m2-lesson5-start

If you want to have a look at the fully implemented lesson, as a reference, feel free to import: m2-lesson5

For the Spring 5 version of these projects, you can use the module2-spring-boot-2 branch: m2-lesson5-start and m2-lesson5

The Maven Dependencies


Advantages of using Jackson for XML

Using the new Jackson Spring support for XML has quite a few advantages over using another XML library (such as XStream):

  • we're already using Jackson for JSON
  • we can re-use the exact same configuration that we're already using for JSON
  • no need to add extra annotations to the DTOs
  • JSON Views support

Why change the default STAX implementation

Woodstox has a few advantages over the default STAX impl in the JDK:

  • it's faster
  • has extra features
  • it's more mature and well maintained

Basics of Content Negotiation

- a JSON Request:

GET http://localhost:8082/api/privileges
Accept: application/json
[ {
  "id" : 1,
  "description" : null
... ]

- an XML Request:

GET http://localhost:8082/api/privileges
Accept: application/xml

Quick note - starting with Spring 4.3.2, we now have support for multiple Accept headers in the HeaderContentNegotiationStrategy.

Upgrade Notes

As mentioned, the woodstox-core-asl dependency which is used for XML processing is a mature and well-maintained library. However, note that the newer versions of the dependency have a different group and artifact id:


3. Resources

- Content negotiation

RwS - Support both XML and JSON - transcript.pdf