Convert a object into JSON in REST service by Spring MVC

By | December 28, 2017

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:

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;

public class StudentService {

    private CourseDAOImpl courseService;
    private StudentDAOImpl studentService;
    private StateDAOImpl stateService;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=*/*")
    public Student home(@PathVariable int id) {
        return this.studentService.getById(id);

    @RequestMapping(method = RequestMethod.GET, headers = "Accept=*/*")
    public List<Student> getAll() throws Exception {
        return this.studentService.getAll();

    @RequestMapping(value = "/test", method = RequestMethod.GET, headers = "Accept=*/*")
    public String test() {
        return "Test REST Service!!!";

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;

    @Size(max = 30)
    private String firstName, lastName;
    //private String lastName;

    private Date DOB, DOA;
    //private Date DOA;

    private String email;
    private String password;
    private int courseID;
    private String courseName;

    public int getId() {
        return id;
    public void setId(int 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) { = 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.


Finally I got solution using Jackson library along with Spring MVC. I got this solution from an example of Journal Dev( )

So, the code changes I have done are:

  • Include the library in Maven.
  • Add JSON conversion Servlet into servlet-context.xml.
  • Change the Model into Serializable.

I didn’t made any changes to my REST service controller. By default it converts into JSON.


You can always add the @Produces("application/json") above your web method or specify produces="application/json" to return json. Then on top of the Student class you can add @XmlRootElement from javax.xml.bind.annotation package.

Please note, it might not be a good idea to directly return model classes. Just a suggestion.



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:

<bean id="contentNegotiationManager"
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="ignoreAcceptHeader" value="true" />
    <property name="useJaf" value="false" />
     <property name="defaultContentType" value="application/json" />

      <property name="mediaTypes">
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />

      content-negotiation-manager="contentNegotiationManager" />

   <context:annotation-config />

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.

Leave a Reply

Your email address will not be published. Required fields are marked *