Background
In some of our earlier posts we saw examples of how Spring controllers work.
In those examples we returned a view name from controller method and subsequently corresponding JSP was returned and rendered. In this post we will see how we can send a xml or a json response instead of a JSP.
Sending xml(JAXB) and json(Jackson) response with Spring MVC @ResponseBody annoatation
Your controller would look like below -
package com.osfg.controllers; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.osfg.model.Employee; /** * * @author athakur * Controller to handle employee information */ @Controller public class EmployeeController { Logger logger = LoggerFactory.getLogger(EmployeeController.class); @RequestMapping(value = "/getEmployeeInfoData", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @ResponseBody public Employee getEmployeeInfo(HttpServletRequest request) { logger.debug("Receive GET request for employee data information"); Employee empForm = new Employee(); empForm.setName("Aniket Thakur"); empForm.setAge(25); return empForm; } }
Most of annotations and code you would already know from previous examples. New thing here is the produces field which is set to
- MediaType.APPLICATION_JSON_VALUE,
- MediaType.APPLICATION_XML_VALUE
which mean your controller method can give response in json or xml.
NOTE : Spring framework matches this produces field with accepts header of incoming request.
and your Employee model object would look like -
package com.osfg.model; import java.io.Serializable; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** * * @author athakur * Model class for Employee */ @XmlRootElement(name = "employee") public class Employee implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Notice the annotations used. Those are required for XML transformation by JAXB library.
NOTE : Don't forget to add <mvc:annotation-driven/> tag in your spring configuration file.
Once above code and configurations are in place all you have to do is put JAXB and jackson jars on classpath. I am using ivy so add following dependency on youe ivy xml -
<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.8.5"/>
NOTE : I am using Java 8. JAXB is inbuilt in java since java 7. So no need to explicitly add it.
You can find the working snippet of above code in my github repo -
https://github.com/aniket91/WebDynamo/blob/master/src/com/osfg/controllers/EmployeeController.java
file of
https://github.com/aniket91/WebDynamo
You can find the working snippet of above code in my github repo -
https://github.com/aniket91/WebDynamo/blob/master/src/com/osfg/controllers/EmployeeController.java
file of
https://github.com/aniket91/WebDynamo