Spring Restful web services CRUD example

This post is in continuation with web service tutorial (Part -15).
    Introduction to web services Web services interview questions SOAP web service introduction RESTful web service introduction Difference between SOAP and REST web services SOAP web service example in java using eclipse JAX-WS web service eclipse tutorial JAX-WS web service deployment on tomcat Create RESTful web service in java(JAX-RS) using jersey RESTful web service JAXRS json example using jersey RESTful web service JAXRS CRUD example using jersey AngularJS RESTful web service JAXRS CRUD example using $http RESTful Web Services (JAX-RS) @QueryParam Example Spring Rest simple example Spring Rest json example Spring Rest xml example Spring Rest CRUD example
In previous post, we have already seen Spring Restful web services which returns json as response.In this post, we will extend same example and create Restful web services which will provide CRUD(Create, read, update and delete) operation example.If you want complete integration with hibernate and mysql, you can go through Spring Restful hibernate mysql example.

<!-- adsense -->

We will use following annotations for CRUD operation.
It is used to read resource
It is used to create new resource.
It is not idempotent method
It is generally used to update resource.It is idempotent method
It is used to delete resource

Idempotent means result of multiple successful request will not change state of resource after initial application
For example :
Delete is idempotent method because when you first time use delete, it will delete the resource (initial application) but after that, all other request will have no result because resource is already deleted.

Post is not idempotent method because when you use post to create resource , it will keep creating resource for each new request, so result of multiple successful request will not be same.

Source code:

click to begin
20KB .zip
Here are steps to create a Spring Restful web services  which will provide CRUD opertion.

1) Create a dynamic web project using maven in eclipse named "SpringRestfulWebServicesCRUDExample"

Maven dependencies 

2) We need to add Jackson json utility in the classpath. 

Spring will load Jackson2JsonMessageConverter into its application context automatically. Whenever you request resource as json with accept headers="Accept=application/json", then Jackson2JsonMessageConverter comes into picture and convert resource to json format.
Now change pom.xml as follows:
<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">
  <name>SpringRestfulWebServicesWithJSONExample Maven Webapp</name>




Spring application configuration:

3) Change web.xml as below:
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

  <display-name>Archetype Created Web Application</display-name>


4) create a xml file named springrest-servlet.xml in /WEB-INF/ folder.
Please change context:component-scan if you want to use different package for spring to search for controller.Please refer to spring mvc hello world example for more understanding.

<beans xmlns="http://www.springframework.org/schema/beans"
 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="org.arpit.java2blog.controller" />


Create bean class 

4) Create a bean name "Country.java" in org.arpit.java2blog.bean.
package org.arpit.java2blog.bean;

public class Country{
 int id;
 String countryName; 
 long population;
 public Country() {
 public Country(int i, String countryName,long population) {
  this.id = i;
  this.countryName = countryName;
 public int getId() {
  return id;
 public void setId(int id) {
  this.id = id;
 public String getCountryName() {
  return countryName;
 public void setCountryName(String countryName) {
  this.countryName = countryName;
 public long getPopulation() {
  return population;
 public void setPopulation(long population) {
  this.population = population;

Create Controller 

5) Create a controller named "CountryController.java" in package org.arpit.java2blog.controller
package org.arpit.java2blog.controller;

import java.util.List;
import org.arpit.java2blog.bean.Country;
import org.arpit.java2blog.service.CountryService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

public class CountryController {

 CountryService countryService = new CountryService();

 @RequestMapping(value = "/countries", method = RequestMethod.GET, headers = "Accept=application/json")
 public List<Country> getCountries() {
  List<Country> listOfCountries = countryService.getAllCountries();
  return listOfCountries;

 @RequestMapping(value = "/country/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
 public Country getCountryById(@PathVariable int id) {
  return countryService.getCountry(id);

 @RequestMapping(value = "/countries", method = RequestMethod.POST, headers = "Accept=application/json")
 public Country addCountry(@RequestBody Country country) {
  return countryService.addCountry(country);

 @RequestMapping(value = "/countries", method = RequestMethod.PUT, headers = "Accept=application/json")
 public Country updateCountry(@RequestBody Country country) {
  return countryService.updateCountry(country);


 @RequestMapping(value = "/country/{id}", method = RequestMethod.DELETE, headers = "Accept=application/json")
 public void deleteCountry(@PathVariable("id") int id) {


Create Service class

6) Create a class CountryService.java in package org.arpit.java2blog.service
It is just a helper class which should be replaced by database implementation. It is not very well written class, it is just used for demonstration.
package org.arpit.java2blog.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.arpit.java2blog.bean.Country;

 * It is just a helper class which should be replaced by database implementation.
 * It is not very well written class, it is just used for demonstration.
public class CountryService {

 static HashMap<Integer,Country> countryIdMap=getCountryIdMap();

 public CountryService() {

   countryIdMap=new HashMap<Integer,Country>();
  // Creating some objects of Country while initializing
   Country indiaCountry=new Country(1, "India",10000);
   Country chinaCountry=new Country(4, "China",20000);
   Country nepalCountry=new Country(3, "Nepal",8000);
   Country bhutanCountry=new Country(2, "Bhutan",7000);


 public List<Country> getAllCountries()
  List<Country> countries = new ArrayList<Country>(countryIdMap.values());
  return countries;

 public Country getCountry(int id)
  Country country= countryIdMap.get(id);
  return country;
 public Country addCountry(Country country)
  countryIdMap.put(country.getId(), country);
  return country;
 public Country updateCountry(Country country)
   return null;
  countryIdMap.put(country.getId(), country);
  return country;

 public void deleteCountry(int id)

 public static HashMap<Integer, Country> getCountryIdMap() {
  return countryIdMap;
 // Utility method to get max id
 public static int getMaxId()
 {   int max=0;
 for (int id:countryIdMap.keySet()) {  

 return max;

7) It 's time to do maven build.
Right click on project -> Run as -> Maven build
Maven build in eclipse

8) Provide goals as clean install (given below) and click on run
Maven build in eclipse

Run the application

9) Right click on project -> run as -> run on server
Select apache tomcat and click on finish

10) We will test this application in  postman , UI based client for testing restful web applications. It is chrome plugin. Launch postman.If you want java based client, then you can also use how to send get or post request in java.

Get method

11) Test your get method Spring REST service
URL :"http://localhost:8080/SpringRestfulWebServicesCRUDExample/countries".
You will get following output:
Get operation in Spring Rest CRUD

Post method

12) Post method is used to create new resource. Here we are adding new Country England to country list, so you can see we have used new country json in post body.
URL: "http://localhost:8080/SpringRestfulWebServicesCRUDExample/countries".
Put operation in Spring Rest CRUD

Use get method to check if above country have been added to country list.

Get operation in Spring Rest CRUD

Put Method

13) Put method is used to update resource. Here will update population of nepal using put method.
We will update country json in body of request.
URL : "http://localhost:8080/SpringRestfulWebServicesCRUDExample/countries"

Get operation in Spring Rest CRUD

Use get method to check population of nepal.
Get operation in Spring Rest CRUD

Delete method

14) Delete method is used to delete resource.We will pass id of country which needs to be deleted as PathParam. We are going delete id:4 i.e. china to demonstrate delete method.

URL : "http://localhost:8080/SpringRestfulWebServicesCRUDExample/country/4"

Delete operation in Spring Rest CRUD

Use get method to check country list.

Get operation in Spring Rest CRUD

As you can see, we have deleted country with id 4 i.e. china

Project structure:

We are done with Spring Restful web services json CRUD example. If you are still facing any issue, please comment.

If you getting 404 error with above steps, you may need to follow below steps:

1) If you are getting this warning into your Tomcat startup console log, then it can cause the issue

WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server: JAXRSJsonCRUDExample' did not find a matching property.

This particular warning basically means that the <Context> element in Tomcat's server.xml contains an unknown attribute source and that Tomcat doesn't know what to do with this attribute and therefore will ignore it.
To resolve this in eclipse,
Remove the project from the server from the Server View. Right click on server -> add and remove

then remove project from server configuration.
Then run the project under the same server. Warning should be removed now
Or if warning still remains then
  • Go to server view
  • Double click on your tomcat server. It will open the server configuration.
  • Under server options check ‘Publish module contents to separate XML files’ checkbox. 
  • Restart your server. This time your page will come without any issues.
2) Try to update Maven project.
Right click on project ->Maven-> update project
Update Maven project

This should solve you issues.

Written by Arpit:

If you have read the post and liked it. Please connect with me on Facebook | Twitter | Google Plus


Java tutorial for beginners Copyright © 2012