I need to write a recreation service that accepts XML / JSON as input (POST method) and XML / JSON as output (based on input format). I tried using the approach below, but didn't help. The Endpoint method accepts as XML / JSON, but it always yields either JSON or XML based on the order specified in @RequestMapping -produces. Any help would be really appreciated.
My final method:
@RequestMapping(value = "/getxmljson", method = RequestMethod.POST,produces={"application/json","application/xml"}, consumes={"application/json", "application/xml"}) public @ResponseBody Student processXMLJsonRequest(@RequestBody Student student) throws Exception { System.out.println("*************Inside Controller"); return student; }
POJO Class: Student.java
import java.io.Serializable; import java.util.ArrayList; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @XmlRootElement(name = "student") @XmlType(propOrder = {"id", "name", "graduationTime", "courses"}) @JsonPropertyOrder({"id", "name", "graduationTime", "courses"}) public class Student implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String graduationTime; private ArrayList<Course> courses = new ArrayList<Course>(); @XmlElement public int getId() { return id; } @XmlElement public String getName() { return name; } @XmlElement public String getGraduationTime() { return graduationTime; } @XmlElement public ArrayList<Course> getCourses() { return courses; } public void setId(int value) { this.id = value; } public void setName(String value) { this.name = value; } public void setGraduationTime(String value) { this.graduationTime = value; } public void setCourses(ArrayList<Course> value) { this.courses = value; } @JsonIgnore public String toString() { return this.name + " - " + graduationTime == null? "Unknown" : graduationTime.toString(); } public Student() {} public Student(int id, String name, String graduationTime) { this.id = id; this.name = name; this.graduationTime = graduationTime; } }
POJO Class: Course.java
import java.io.Serializable; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @XmlRootElement(name = "course") @XmlType(propOrder = {"courseName", "score"}) @JsonPropertyOrder({"courseName", "score"}) public class Course implements Serializable { private static final long serialVersionUID = 1L; private String courseName; private Integer score; public @XmlElement String getCourseName() { return courseName; } public @XmlElement Integer getScore() { return score; } public void setCourseName(String value) { courseName = value; } public void setScore(Integer value) { score = value; } public Course() {} public Course(String courseName, Integer score) { this.courseName = courseName; this.score = score; } }
spring -config.xml
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:sws="http://www.springframework.org/schema/web-services" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <annotation-driven /> <resources mapping="/resources/**" location="/resources/" /> <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <beans:property name="messageConverters"> <beans:list> <beans:ref bean="jsonMessageConverter" /> <beans:ref bean="xmlMessageConverter" /> </beans:list> </beans:property> </beans:bean> <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </beans:bean> <beans:bean id="xmlMessageConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"> </beans:bean> <beans:bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> </beans:bean> <beans:bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" /> <context:component-scan base-package="com.test" /> </beans:beans>
Json Input:
{ "id":2014, "name":"test", "graduationtime":"09/05/2014", "courses":[ { "courseName":"Math", "score":150 }, { "courseName":"Che", "score":150 } ] }
XML input:
<?xml version="1.0" encoding="UTF-8" ?> <student> <id>2014</id> <name>test</name> <graduationTime>09/05/2014</graduationTime> <courses> <courseName>Math</courseName> <score>150</score> </courses> <courses> <courseName>Che</courseName> <score>150</score> </courses> </student>