Google App Engine + Spring 3 MVC REST example
In this tutorial, we will show you how to develop and deploy a Spring 3.0 MVC REST web application in Google App Engine (GAE) environment.
Tools and technologies used :
- Google App Engine Java SDK 1.6.3.1
- Spring 3.1.1
- JDK 1.6
- Eclipse 3.7 + Google Plugin for Eclipse
This example is going to reuse this Spring 3 MVC REST example, modify it and integrate with Google App Engine, you may also interest to read this – GAE + Java + Eclipse example
1. New Web Application Project
In Eclipse, create a new Web Application project, named as “SpringMVCGoogleAppEngine“.

The “Google Plugin for Eclipse” will generate a sample of GAE project structure.
2. Spring 3.0 Dependencies
To use Spring MVC + REST in GAE, you need following jars
- aopalliance-1.0.jar
- commons-logging-1.1.1.jar
- spring-aop-3.1.1.RELEASE.jar
- spring-asm-3.1.1.RELEASE.jar
- spring-beans-3.1.1.RELEASE.jar
- spring-context-3.1.1.RELEASE.jar
- spring-context-support-3.1.1.RELEASE.jar
- spring-core-3.1.1.RELEASE.jar
- spring-expression-3.1.1.RELEASE.jar
- spring-web-3.1.1.RELEASE.jar
- spring-webmvc-3.1.1.RELEASE.jar
Copy and put it in “war/WEB-INF/lib” folder.

Add it to your project’s build path as well – right click on project folder, select “Properties“. Select “Java Build Path” -> “Libraries” tab, click “Add Jars” button and select above jars.

3. Spring Controller
3.1 Delete auto generated SpringMVCGoogleAppEngineServlet.java, you don’t need this.
3.2 Create a bean, act as controller in REST structure. In addition, DI a message into the “message” property.
File : src/com/mkyong/MovieController.java
package com.mkyong.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/movie") public class MovieController { //DI via Spring String message; @RequestMapping(value="/{name}", method = RequestMethod.GET) public String getMovie(@PathVariable String name, ModelMap model) { model.addAttribute("movie", name); model.addAttribute("message", this.message); //return to jsp page, configured in mvc-dispatcher-servlet.xml, view resolver return "list"; } public void setMessage(String message) { this.message = message; } }
4. JSP Pages
Create a list.jsp page, display the result.
File : war/list.jsp
<html> <body> <h1>GAE + Spring 3 MVC REST example</h1> <h3>Movie : ${movie} , DI message : ${message}</h3> </body> </html>
5. Spring Configuration
Create a Spring XML bean configuration file, define the beans and view resolver.
File : war/WEB-INF/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"> <!-- Need DI a message into controller, so auto component scan is disabled, to avoid double create the movieController bean. Only controller need this hack. --> <context:component-scan base-package="com.mkyong.controller"> <context:exclude-filter type="regex" expression="com.mkyong.controller.Movie.*" /> </context:component-scan> <mvc:annotation-driven /> <!-- Bean to show you Di in GAE, via Spring, also init the MovieController --> <bean class="com.mkyong.controller.MovieController"> <property name="message"> <value>Hello World</value> </property> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
6. web.xml
Update web.xml, integrate Spring framework.
File : war/WEB-INF/web.xml
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
7. Directory Structure
Review the final directory structure.

8. Run on Local
Right click on the project, run as “Web Application“.
URL : http://localhost:8888/movie/Avengers

9. Deploy on GAE
Update appengine-web.xml file, add your App Engine application ID.
File : war/WEB-INF/appengine-web.xml
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>mkyong-springmvc</application> <version>1</version> <system-properties> <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> </system-properties> </appengine-web-app>
Select project, click on Google icon, “Deploy to App Engine“.
URL : http://mkyong-springmvc.appspot.com/movie/forrest%20gump

Download Source Code
Due to large file size, all Spring and GAE jars are excluded.
References
- Spring 3.0 beans reference
- REST explains Wikipedia
- Google App Engine + Java + Google Plugin for eclipse example
- Spring 3 MVC hello world example
- Spring 3 REST hello world example
- Google Add Engine Java doc

Hi,
I tried your tutorial but this is not working. I got the below error.
HTTP ERROR: 503
Problem accessing /movie/Avengers. Reason:
SERVICE_UNAVAILABLE
Can you please help me to solve this issue
Thanks.
the only way to get rid of temptation is to yield to it… i can resist everything but temptation. jaw crusher price http://jawcrushers.yolasite.com/
Hi,
Thanks for good tutorial.
I want to know GAE is support for Hibernate or not.
Thank you.
It is not supported.
Have a look to code.google.com/p/googleappengine/wiki/WillItPlayInJava
Perfect, clean, and robust tutorial. Thanks for sharing.
My IDE is JetBrains IntelliJ IDEA and I’m trying to deploy to the local App Engine development server from the SDK. I was receiving a “could not locate artifacts/…/appengine-web.xml” error on run. The fix is based on http://erikeldridge.wordpress.com/tag/appengine/
In IntelliJ IDEA, Ctrl+Shift+Alt+S and look in the “Facets” project settings on the left. You will have already setup a “web:war exploded” Facet and simply need to add appengine-web.xml and web.xml to the list of files in the Output Layout.
Hi Mkyong,
I need your help. I have a requirement in that I have to use AOP framework on both a client and server side. Here the client is android cellphone and server is GAE. What I want to do is need to offload a part of the android module to cloud for computation which consumes lots of battery, power and memory or else it will be run in android cellphone itself. please give some suggestions how to go about it. Thank you.
works on local, but doesn’t work when deployed to GAE!
sorry, used to wrong spring jars. changed to correct ones as mentioned by Mr Yong, now its working, thanks!
Here are the Jars, just downloaded from Maven repositories.
https://docs.google.com/open?id=0B3yWZxAiFGhzbjVOcEhLMDU4c0k
Thanks for this tutorial. It’s exactly what I needed and worked as described. As a side note, for Step 2 (Spring 3.0 Dependencies), I found the necessary jars on maven.
jm
hey ,
im looking for this jars .
can u please send me link or tell me how to get them .
thank
bar
The jars themselves are hosted on maven.org but sites like mvnrepository.com and grepcode.com provide links and background info for these files. Just google the name of one of the jars and you’ll see these third-party sites that link to the downloads from maven.org. Hope this helps.
I am a Java Er. and I want to read more on web services please suggest me….
REST web services or soap ?
if restful like this great example (Thanks!), a more fully featured example is here:
http://www.ibm.com/developerworks/webservices/library/wa-restful/index.html
Thanks for your example, look forward to using it…but was wondering if based on your experience, is there a best rest framework to rely upon ? i.e. spring mvc rest vs. spring rest templates vs. gae spring server…and nice to have would be control over format of serialized objects….
Thanks again.
-tony
i meant gae rest server not spring server
spring rest will be portable across platforms, in case you decide to scrap GAE, anyway.