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 skip and see the complete implementation, feel free to jump ahead and import: m2-lesson5
The Maven Dependencies
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency> <dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>woodstox-core-asl</artifactId> <version>4.4.1</version> </dependency>
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, "name" : "ROLE_PRIVILEGE_READ", "description" : null }, ... ]
- an XML Request:
GET http://localhost:8082/api/privileges Accept: application/xml <List> <item> <id>1</id> <name>ROLE_PRIVILEGE_READ</name> <description/> </item> ... </List>
Quick note - starting with Spring 4.3.2, we now have support for multiple Accept headers in the HeaderContentNegotiationStrategy.
3. Resources
RwS - Support both XML and JSON - transcript.pdf