Spring 3 MVC and JSON example

In this tutorial, we show you how to output JSON data in Spring MVC framework.

Technologies used :

  1. Spring 3.2.2.RELEASE
  2. Jackson 1.9.10
  3. JDK 1.6
  4. Eclipse 3.6
  5. Maven 3

P.S In Spring 3, to output JSON data, just puts Jackson library in the project classpath.

1. Project Dependencies

Get Jackson and Spring dependencies.

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
        http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mkyong.common</groupId>
	<artifactId>SpringMVC</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>SpringMVC Json Webapp</name>
	<url>http://maven.apache.org</url>
 
	<properties>
		<spring.version>3.2.2.RELEASE</spring.version>
		<jackson.version>1.9.10</jackson.version>
		<jdk.version>1.6</jdk.version>
	</properties>
 
	<dependencies>
 
		<!-- Spring 3 dependencies -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<!-- Jackson JSON Mapper -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>${jackson.version}</version>
		</dependency>
 
	</dependencies>
 
	<build>
		<finalName>SpringMVC</finalName>
		<plugins>
		  <plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-eclipse-plugin</artifactId>
			<version>2.9</version>
			<configuration>
				<downloadSources>true</downloadSources>
				<downloadJavadocs>false</downloadJavadocs>
				<wtpversion>2.0</wtpversion>
			</configuration>
		  </plugin>
		  <plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.3.2</version>
			<configuration>
				<source>${jdk.version}</source>
				<target>${jdk.version}</target>
			</configuration>
		  </plugin>
		</plugins>
	</build>
 
</project>

2. Model

A simple POJO, later output this object as formatted JSON data.

package com.mkyong.common.model;
 
public class Shop {
 
	String name;
	String staffName[];
 
	//getter and setter methods
 
}

3. Controller

Add @ResponseBody as return value. Wen Spring sees

  1. Jackson library is existed in the project classpath
  2. The mvc:annotation-driven is enabled
  3. Return method annotated with @ResponseBody

Spring will handle the JSON conversion automatically.

JSONController.java
package com.mkyong.common.controller;
 
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.mkyong.common.model.Shop;
 
@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
 
	@RequestMapping(value="{name}", method = RequestMethod.GET)
	public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
 
		Shop shop = new Shop();
		shop.setName(name);
		shop.setStaffName(new String[]{"mkyong1", "mkyong2"});
 
		return shop;
 
	}
 
}

4. mvc:annotation-driven

Enable mvc:annotation-driven in your Spring configuration XML file.

mvc-dispatcher-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
 
	<context:component-scan base-package="com.mkyong.common.controller" />
 
	<mvc:annotation-driven />
 
</beans>

5. Demo

URL : http://localhost:8080/SpringMVC/rest/kfc/brands/kfc-kampar

spring mvc and json demo

Download Source Code

Download it – SpringMVC-Json-Example.zip (21 KB)

References

  1. mvc-annotation-driven documentation
  2. High-performance JSON processor
  3. Spring MVC and XML example
Tags :

About the Author

mkyong
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

  • http://julien-dumortier.fr julien

    it’s perfect ! thank’s !

  • http://www.enricogi.blogspot.com enrico

    Simple and effective, well done!

  • Aneesh

    How about the method=POST..couldnt get it working..

  • the dude

    thanks a lot , nice review!!!

    • Santosh Tambralli

      I am receiving following error for downloaded project zip.!!

      The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers.

  • Dmytro

    Is it possible to configure pretty print here?

  • http://soft-project.pl alapierre

    sorry:

    atom=application/atom+xml
    html=text/html
    json=application/json
    *=*/*

  • http://soft-project.pl alapierre

    Hi,

    this example not working with Spring 3.2.2 and 3.2.3. It only work on Spring 3.1.4 and older version. I tested it with tomcat 7.x and JDK 1.7

    For Spring 3.2.2 and 3.2.3 I got: HTTP Status 406 – The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers.

    Can any one help me?

    • Jeff

      @mykong.. as usual.. simple and perfect example.. It worked.. thnx..

      @alapierre… I used Spring 3.2.4.. didnot have any problem, it worked. for you Http status 406 error, please include “jackson-core-asl” and “jackson-mapper-asl” jars in your lib folder.

  • moez

    hi, I m khaled moez i have probleme when i want to
    recuperate the object employe but when i put de type string or int it’s work and we recuperate this string . i don’t undrestand what is the probleme

    @RequestMapping(value = “employeeEntity/addd”, method = RequestMethod.POST)
    public @ResponseBody String add(HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    EmployeeEntity employee = new EmployeeEntity();

    employee.setEmail(“”);
    employee.setId(12);
    employee.setLastname(“”);
    employee.setTelephone(“77″) ;
    employee.setFirstname(“”);

    System.out.println(“je suis la pour tester “);
    return “fffffffffff” ;
    }

    ***************************************************************************************
    function madeAjaxCall(){
    $.ajax({
    type: “post”,
    url: “http://localhost:8089/Applipdf/employeeEntity/addd”,
    cache: false,
    //data:’firstName=’ + $(“#firstName”).val() + “&lastName=” + $(“#lastName”).val() + “&email=” + $(“#email”).val(),
    success: function(response){
    $(‘#result’).html(response);
    // var obj = JSON.parse(response);
    // $(‘#result’).html(“First Name:- ” + obj.firstName +”Last Name:- ” + obj.lastName + “Email:- ” + obj.email);
    },
    error: function(){
    alert(‘Error while request..’);
    }
    });
    }

  • Dino

    The tutorial is very helpful and easy to follow, thank you.

  • PianeRamso

    Thanks a lot! Very clear and simple article.

  • Pingback: [Spring MVC] Not returning json content – error Http 406 | Diegoitaliait's Blog()

  • http://gerrytan.wordpress.com Gerry

    Thanks for the simple and short tutorial. It helps a lot.

  • Pingback: Jayson JSON « TechnoBuzz()

  • Hitesh

    Thank you. Good work. Helped me learn fast.

  • Ahmad Alhaj Hussein

    make sure that you add two jackson related jar files.
    jackson-core-asl-1.9.8.jar
    jackson-mapper-asl-1.9.8.jar

    • http://mariuzzo.com Rubens Mariuzzo

      @Ahmad, Apache Maven will just handle the dependencies correctly by adding the core required library.

  • huhongyu

    hello,when i user ie open this, ie would make me downlaod.

  • http://Verycoolsupportandoutstandingsupports Sripati Das

    It really helped me to configure json in spring 3.0. Big thanks to you from me :)

  • Trung

    Hi
    in Your source Exsample and your description,
    there has not “/kfc/brands” folder. in that folder, what does it have?
    so, I can not run your Example. You would like to show me, please

  • Karthick

    Hi, Im getting the below error when trying to do this(@ResponseBody),

    com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[chpServlet]: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: SRVE0295E: Error reported: 500
    at com.ibm.ws.webcontainer.webapp.WebAppDispatcherContext.sendError(WebAppDispatcherContext.java:624)
    at com.ibm.ws.webcontainer.webapp.WebAppDispatcherContext.sendError(WebAppDispatcherContext.java:642)
    at com.ibm.ws.webcontainer.srt.SRTServletResponse.sendError(SRTServletResponse.java:1236)
    at com.ibm.ws.webcontainer.srt.SRTServletResponse.sendError(SRTServletResponse.java:1210)
    at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:344)
    at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:131)
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136)
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1120)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:944)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1214)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:77)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:926)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1023)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)

    Any inputs on this. Although this happens for one type of object only. Im running Spring 3.1.2 on WAS 8.

    • Jack Beukering

      I now have exacltly the same problem, did you find any solution for your problem? Please help me.

      • Karthick

        Yeah I was able to figure that out. I had an empty class(that was JAXB Generated). It was causing the issue. Like, public class DataIndicator{}. There was no variable within it. I changed the schema(that was in my case). Check if you have a similar empty class(that is a part of the response object that ur trying to convert it to JSON). Hope this helps!!

  • praveen d

    simply rocks….mkyong

  • http://www.xibeta.com xibeta

    you should add “@ResponseBody” to the method …

  • Pingback: Responsive Web Design using Twitter Bootstrap, Spring MVC | Spring under the hood()

  • nik

    Thanks for this post. I dont see an configuration which explicitly sets the response type to json. Is that something that happens by default. For example if i wanted to have an xml response type what would i need to do?

    Thanks,
    N

    • ruofeng

      how to do ,i want to know too

  • swapnil narvekar

    This is very nice website…
    Very useful articles are posted here..
    Thanks for you…

  • Kevin_405

    Would be nice if u can enhance the tutorial for WADL and some way of generating the code from the WADL like we could do using WSDL

    I just hate REST because it got rid of the Service Definition part of SOAP for convenience.

  • Pingback: Returning a java.util.List from a Spring MVC controller via Ajax using Jackson - Tech Forum Network()

  • Kris J

    I already have a PDF document generated by my backend, how do I return this in a RESTful service? What will the MarshallingView and ContentNegotiatingViewResolver look like?

    thank you.

  • Pingback: Jak szybko stworzy? aplikacje webow?, która zwraca JSON-a « Mia?a by? Java()

  • flume

    what about post how to get the json data post in the json format … please give an example

  • Faheem

    i am getting this error when running this example in browser. plz help

    The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers ().

    • raghavendra.katta

      Hi,

      You should in servlet.xml file and ensure the file should be error free.

      • raghavendra.katta

        add in servlet.xml

    • ATaK

      I get this same exact error in response. Status 406: “The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers ().”

      I have exactly followed this procedure and also making sure my dependency for Jackson is set correctly. Here are more details if anyone has gotten this to resolve
      http://stackoverflow.com/questions/12865093/spring-3-x-json-status-406-characteristics-not-acceptable-according-to-the-requ

    • Cristian G.

      Make sure you use Jackson 1.x, not 2.x

  • Deepak

    Hi,

    How can I use MarshallingViewResolver to handle the conversion for json?
    Could someone take me through it?

  • https://semikas.blogspot.com Semika Siriwardana

    Thanks you. Very nice tutorial. This post has a huge value.

  • Jerry

    If one of the JSON name value pairs need to be made optional, what’s the best way to go about it ?
    Eg. In this example String staffName[]; is optional…

    • Jerry

      Setup defaults in the constructor and got going :-)

  • Pingback: Rest, Json and Spring « Yes, Nós Temos Bananas()

  • Bok

    Great example! Very helpful! Thanks!

  • John Doe

    A really good working example, thanks a lot :)

  • Rani

    Unable to run this example. I downloaded all the dependencies. Still I’m getting error
    No mapping found for HTTP request with URI [/JSONTest/rest/kfc/brands/Rani]

    • Mandar J

      I had same issue. My classes were not compiled because build class path was pointing to maven repository. I changed to jars in web-inf/lib and re-compiled. It is working now.

  • Dinesh

    Missing:
    ———-
    1) net.sf.sojo:sojo-optional:jar:0.5.0

    Try downloading the file manually from the project website.

    Then, install it using the command:
    mvn install:install-file -DgroupId=net.sf.sojo -DartifactId=sojo-optional -Dversion=0.5.0 -Dpackaging=jar -Dfile=/path/to/file

    Alternatively, if you host your own repository you can deploy the file there:
    mvn deploy:deploy-file -DgroupId=net.sf.sojo -DartifactId=sojo-optional -Dversion=0.5.0 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

    Path to dependency:
    1) SpringDemos:SpringDemos:jar:1.0
    2) net.sf.spring-json:spring-json:jar:1.1
    3) net.sf.sojo:sojo-optional:jar:0.5.0

    ———-
    1 required artifact is missing.

    for artifact:
    SpringDemos:SpringDemos:jar:1.0

    from the specified remote repositories:
    central (http://repo1.maven.org/maven2)

  • Dinesh

    Problem in downloading dependencies

  • developerr

    I had to add the following jackson dependencies to get the downloaded example to work.

    		<!-- Jackson -->
    		<dependency>
    			<groupId>org.codehaus.jackson</groupId>
    			<artifactId>jackson-core-lgpl</artifactId>
    			<version>1.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.codehaus.jackson</groupId>
    			<artifactId>jackson-mapper-lgpl</artifactId>
    			<version>1.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.codehaus.jackson</groupId>
    			<artifactId>jackson-xc</artifactId>
    			<version>1.3.0</version>
    		</dependency>
  • mahesh

    Hi
    public ActionResult About()
    {
    List listStores = new List();
    listStores = this.GetResults(“param”);
    return Json(listStores, “Stores”, JsonRequestBehavior.AllowGet);
    }

    Using the above code i am able to get the below result :

    [{“id”:”1″,”name”:”Store1″,”cust_name”:”custname1″,”telephone”:”1233455555″,”email”:”[email protected]”,”geo”:{“latitude”:”12.9876″,”longitude”:”122.376237″}},{“id”:”2″,”name”:”Store2″,”cust_name”:”custname2″,”telephone”:”1556454″,”email”:”[email protected]”,”geo”:{“latitude”:”12.9876″,”longitude”:”122.376237″}},

    how would i able to get the result in below format ? would need stores at the beginning of the result.

    {
    “stores” : [
    {“id”:”1″,”name”:”Store1″,”cust_name”:”custname1″,”telephone”:”1233455555″,”email”:”[email protected]”,
    “geo”:{“latitude”:”12.9876″,”longitude”:”122.376237″}},{“id”:”2″,”name”:”Store2″,”cust_name”:”custname2″,”telephone”:”1556454″,”email”:”[email protected]”,”geo”:{“latitude”:”12.9876″,”longitude”:”122.376237″}} ] }

    Please help me in this regard.

  • cnukvd100

    If Mavan build doesn’t work replace the build tag with following one.
    Use Maven 3.x

    SpringMVC

    maven-compiler-plugin
    2.2

    1.6
    1.6

  • cnukvd100

    useful example
    Thanks

  • Suranjana

    Thanks!!!
    This exactly what I need to build on..

  • venkat

    Hello,

    I am working on Spring MVC 3.0 JAXB & REST. I am new to these technologies. I am learning from your examples.

    In the above examples I didn’t understand the URL format. Could you explain it. where was the “rest” configured (http://localhost:8080/SpringMVC/rest/kfc/brands/kfc-kampar)

    I am getting 404 error when trying to execute this one in eclipse

    • http://www.smartcloudlearning.com Dilip Shah

      SpringMVC is the webapp (directory name in the web server’s webapps directory)

      In the webapp’s web.xml, the url mapping includes ‘rest’ as follows:

      &lt;servlet-mapping&gt;
      		&lt;servlet-name&gt;mvc-dispatcher&lt;/servlet-name&gt;
      		&lt;url-pattern&gt;/rest/*&lt;/url-pattern&gt;
      	&lt;/servlet-mapping&gt;

      The controller takes you further in the url with the following annotation:
      @RequestMapping(“kfc/brands”)

      Whatever comes after that in the url is the ‘name’ PathVariable

      I hosted his example in Tomcat and it works.

      I discovered that the only misleading part in this example is the following in web.xml:

      &lt;context-param&gt;
      		&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
      		&lt;param-value&gt;/WEB-INF/mvc-dispatcher-servlet.xml&lt;/param-value&gt;
      	&lt;/context-param&gt;

      Since the servlet name, as defined in web.xml, is mvc-dispatcher, the default dispatcher servlet name is mvc-dispatcher-servlet.xml, which coincides with the given name in the web.xml
      If you try to give any other name via this mechanism, the application will not work. You need to specify via servlet’s init-param as follows:

      &lt;init-param&gt;
      			&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
      			&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;
      		&lt;/init-param&gt;
  • http://www.smartcloudlearning.com Dilip Shah

    Thank you… very helpful.

    Code snippet such as the following will allow UI to get to the controller:
    $(document).ready(function() {
    $.getJSON(“http://localhost:8080/SpringMVC/rest/kfc/brands/kfc-kampar”, function(shop) {
    alert(shop.name);
    });
    });

  • DT

    When I run this example, its giving me Open/Save dialog on UI instead of printing JSOn data on browser.

    How would I print on browser ? Do I need to set any Accept header ?

  • Majid

    Hi,
    I like your way of explaining things, all your helps are appreciated.

    Can you please teach us how to interact from HTML (or jsp) to call an MVC controller , the controller will send data (as json)back to the page and update a div area.

    Thanks lot.
    Majid

    • Srikanth

      Can you please post the reponse mapping code using json (I want to take json as an input to the spring controller and process the data)

  • Pingback: Spring MVC Tutorial()

  • Pingback: Spring 3 MVC ContentNegotiatingViewResolver example()