Table of Contents
- 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 tomcatCreate
- 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 simple Restful web services(JAXWS) which returns json as response.In this post, we will extend same example and create Restful web services(JAXWS) using jersey which will provide CRUD(Create, read, update and delete) operation example.
We will use following annotations for CRUD operation.
Method
|
Description
|
Get
|
It is used to read resource
|
Post
|
It is used to create new resource.
It is not idempotent method |
Put
|
It is generally used to update resource.It is idempotent method
|
Delete
|
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:
Here are steps to create a simple Restful web services(JAXWS) using jersey which will provide CRUD opertion.
1) Create a dynamic web project using maven in eclipse named “JAXRSJsonCRUDExample”
Maven dependencies
2) We need to add jersey jars utility in the classpath.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey.version}</version> </dependency> |
Now create pom.xml as follows:
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<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.arpit.java2blog</groupId> <artifactId>JAXRSJsonExample</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>JAXRSJsonExample Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jersey.version>1.18.3</jersey.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>JAXRSJsonExample</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project> |
Application configuration:
3) create web.xml as below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>org.arpit.java2blog.controller</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> |
Create bean class
4) Create a bean name “Country.java” in org.arpit.java2blog.bean.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package org.arpit.java2blog.bean; public class Country{ int id; String countryName; long population; public Country() { super(); } public Country(int i, String countryName,long population) { super(); this.id = i; this.countryName = countryName; this.population=population; } 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
package org.arpit.java2blog.controller; import java.util.List; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.arpit.java2blog.bean.Country; import org.arpit.java2blog.service.CountryService; @Path("/countries") public class CountryController { CountryService countryService=new CountryService(); @GET @Produces(MediaType.APPLICATION_JSON) public List getCountries() { List listOfCountries=countryService.getAllCountries(); return listOfCountries; } @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public Country getCountryById(@PathParam("id") int id) { return countryService.getCountry(id); } @POST @Produces(MediaType.APPLICATION_JSON) public Country addCountry(Country country) { return countryService.addCountry(country); } @PUT @Produces(MediaType.APPLICATION_JSON) public Country updateCountry(Country country) { return countryService.updateCountry(country); } @DELETE @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public void deleteCountry(@PathParam("id") int id) { countryService.deleteCountry(id); } } |
@Path(/your_path_at_class_level) : Sets the path to base URL + /your_path_at_class_level. The base URL is based on your application name, the servlet and the URL pattern from the web.xml” configuration file.
@Path(/your_path_at_method_level): Sets path to base URL + /your_path_at_class_level+ /your_path_at_method_level
@Produces(MediaType.APPLICATION_JSON[, more-types ]): @Produces defines which MIME type is delivered by a method annotated with @GET. In the example text (“text/json”) is produced.
Create Service class
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
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() { super(); if(countryIdMap==null) { 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); countryIdMap.put(1,indiaCountry); countryIdMap.put(4,chinaCountry); countryIdMap.put(3,nepalCountry); countryIdMap.put(2,bhutanCountry); } } public List getAllCountries() { List countries = new ArrayList(countryIdMap.values()); return countries; } public Country getCountry(int id) { Country country= countryIdMap.get(id); return country; } public Country addCountry(Country country) { country.setId(countryIdMap.size()+1); countryIdMap.put(country.getId(), country); return country; } public Country updateCountry(Country country) { if(country.getId()<=0) return null; countryIdMap.put(country.getId(), country); return country; } public void deleteCountry(int id) { countryIdMap.remove(id); } public static HashMap<Integer, Country> getCountryIdMap() { return countryIdMap; } } |
7) It ‘s time to do maven build.
Right click on project -> Run as -> Maven build
Run the application
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 REST service
URL :“http://localhost:8080/JAXRSJsonCRUDExample/rest/countries”.
You will get following output:
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/JAXRSJsonCRUDExample/rest/countries”.
Use get method to check if above country have been added to country list.
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/JAXRSJsonCRUDExample/rest/countries”
Use get method to check population of nepal.
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/JAXRSJsonCRUDExample/rest/countries/4”
Use get method to check country list.
As you can see, we have deleted country with id 4 i.e. china
Project structure:
We are done with Restful web services json CRUD example using jersey. If you are still facing any issue, please comment.
Was this post helpful?
Share this
-
Prev
AngularJS Restful web service example using $http
-
Next
Spring Restful web services CRUD example
Thanks a lot for well written example
Thanks it helps
Great it helped me
nice tutorial
The best article till date for me for understanding Restful CRUD operations using Jersey implementation. Hats off to you!! Thank you.