I'm trying to create a REST service using Spring MVC and it's working if I'm returning a plain string. My requirement is to return a JSON string of the Java object. Don't know how to achieve this by implicit conversion.
Here is my code:
StudentService.java
package com.spring.schoolmanagement.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.spring.schoolmanagement.dao.CourseDAOImpl;
import com.spring.schoolmanagement.dao.StateDAOImpl;
import com.spring.schoolmanagement.dao.StudentDAOImpl;
import com.spring.schoolmanagement.model.Student;
@Controller
@RequestMapping("/rest/student")
public class StudentService {
@Autowired
private CourseDAOImpl courseService;
@Autowired
private StudentDAOImpl studentService;
@Autowired
private StateDAOImpl stateService;
@RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public Student home(@PathVariable int id) {
return this.studentService.getById(id);
}
@RequestMapping(method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public List<Student> getAll() throws Exception {
return this.studentService.getAll();
}
@RequestMapping(value = "/test", method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public String test() {
return "Test REST Service!!!";
}
}
Student.java
package com.spring.schoolmanagement.model;
import java.util.Date;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
public class Student extends Contact{
private int id;
@NotEmpty
@Size(max = 30)
private String firstName, lastName;
//private String lastName;
@DateTimeFormat(pattern="MM/dd/yyyy")
private Date DOB, DOA;
//private Date DOA;
@NotEmpty
@Email
private String email;
private String password;
private int courseID;
private String courseName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDOB() {
return DOB;
}
public void setDOB(Date dOB) {
DOB = dOB;
}
public Date getDOA() {
return DOA;
}
public void setDOA(Date dOA) {
DOA = dOA;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getCourseID() {
return courseID;
}
public void setCourseID(int courseID) {
this.courseID = courseID;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
}
Here http://localhost:8080/schoolmangement/rest/student/test URL is returning "Test REST Service!!!"
But, http://localhost:8080/schoolmangement/rest/student/1 URL throwing HTTP Status code 406 with error message:
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.
Another simple solution is to add jackson-databind dependency in POM.
Keep Rest of the code as it is.
Spring framework itself handles json conversion when controller is annotated properly.
For eg:
Here spring internally converts the UpdateResponse object to corresponding json string and returns it. In order to do it spring internally uses Jackson library.
If you require a json representation of a model object anywhere apart from controller then you can use objectMapper provided by jackson. Model should be properly annotated for this to work.
Eg:
You can always add the
@Produces("application/json")
above your web method or specifyproduces="application/json"
to return json. Then on top of theStudent
class you can add@XmlRootElement
fromjavax.xml.bind.annotation
package.Please note, it might not be a good idea to directly return model classes. Just a suggestion.
HTH.
The Json conversion should work out-of-the box. In order this to happen you need add some simple configurations:
First add a contentNegotiationManager into your spring config file. It is responsible for negotiating the response type:
Then add Jackson2 jars (jackson-databind and jackson-core) in the service's class path. Jackson is responsible for the data serialization to JSON. Spring will detect these and initialize the MappingJackson2HttpMessageConverter automatically for you. Having only this configured I have my automatic conversion to JSON working. The described config has an additional benefit of giving you the possibility to serialize to XML if you set accept:application/xml header.
Finally I got solution using Jackson library along with Spring MVC. I got this solution from an example of Journal Dev( http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program )
So, the code changes I have done are:
I didn't made any changes to my REST service controller. By default it converts into JSON.