This tutorial I am going to demonstrate how to integrate GlassFish Jersey and Spring 3 to create a RESTFul web service. Using this I am going to show how to inject a bean to the web service class. In this example I will be injecting the service layer object to web service.
- Jersey 1.8
- Spring 3.0.5.RELEASE
- JDK 1.7
- Tomcat 7.0
- Maven
- Eclipse
- Service Layer Interface
- Service Layer Class
- Web Service Class
- Spring Bean Configuration
- Configuration for Spring and Jersey
- Application Deployment
- Testing
1 | mvn archetype:generate -DgroupId=com.techiekernel.rest -DartifactId=Spring-Jersey -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false |
After executing, the project will be get created with pom.xml file. As I am using JDK 7 and annotations, I have to specify the updated maven plugin. After giving the Jersey and Spring dependency, the pom.xml looks as following.
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | <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.techiekernel.rest</groupId> <artifactId>Spring-Jersey</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>JAXRS-Jersey Maven Webapp</name> <url>http://maven.apache.org</url> <repositories> <repository> <id>maven2-repository.java.net</id> <name>Java.net Repository for Maven</name> <url>http://download.java.net/maven/2/</url> </repository> </repositories> <dependencies> <!-- Jersey --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.8</version> </dependency> <!-- Spring 3 dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- Jersey + Spring --> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-spring</artifactId> <version>1.8</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> <finalName>Spring-Jersey</finalName> </build> </project> |
Service Layer Interface:
As I will show the Spring IOC or dependency injection, I am going to create the service layer interface and later a implimentation for the same.
1 2 3 4 5 | package com.techiekernel.service; public interface FooBarService { public String getMessage(String msg); } |
Service Layer Class:
1 2 3 4 5 6 7 8 | package com.techiekernel.service; public class FooBarServiceImpl implements FooBarService{ public String getMessage(String msg) { String output = "FooBar say : " + msg; return output; } } |
Web Service Class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.techiekernel.rest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.techiekernel.service.FooBarService; @Component @Path("/foobar") public class FooBarWS { @Autowired FooBarService fooBarService; @GET @Path("/{param}") public Response getMessage(@PathParam("param") String msg) { return Response.status(200).entity(fooBarService.getMessage(msg)).build(); } } |
Spring Bean Configuration:
Now it is time to cleate the configuration for spring beans in applicationContext.xml. It is very much required to place the following configuration in classpath, so that container will read from the deployment descriptor.
1 2 3 4 5 6 7 8 9 10 11 12 | <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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"> <context:component-scan base-package="com.techiekernel.rest" /> <bean id="FooBarWs" class="com.techiekernel.service.FooBarServiceImpl" /> </beans> |
Configuration for Spring and Jersey:
The integration is going to be in web.xml. Register Spring “ContextLoaderListener” listener class and specify the Jersey servlet “com.sun.jersey.spi.spring.container.servlet.SpringServlet“ as front controller for web services.
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 | <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring Jersey</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class> com.sun.jersey.spi.spring.container.servlet.SpringServlet </servlet-class> <init-param> <param-name> com.sun.jersey.config.property.packages </param-name> <param-value>com.techiekernel.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app> |
Application Deployment:
Now every thing is ready and time to build for creating a war file.
1 | mvn clean install; |
On successful completion of the above command a war file will be get created in target folder. Copy the war file to webapp folder of your tomcat and start the tomcat.
Testing:
Once tomcat is started use the following url to access the web service.
1 | http://localhost:8080/Spring-Jersey/ws/foobar/techiekernel |
Output:
Once you hit the url in the browser, you are going to get the following output.
1 | FooBar say : techiekernel |
Source Code:
You can pull the code from GitHub.
0 comments:
Post a Comment