Tuesday, October 30, 2007

Hello World! REST web service using Jersey and Glassfish

Recently I had the need to expose some EJB application functionality to a client PHP application. I wanted to avoid the heavy weight SOAP protocol and REST seemed like a good choice. Wanting to stay within the JAVA language for a more seamless developer experience I came across the JSR 311 spec and the implementation Jersey.

If you are a JAVA programmer and are wanting to use REST in your architecture you might want to investigate Jersey. Most of the Jersey documentation on the web is using Netbeans. I wanted to use Eclipse since that is my primary IDE. So a short post on the Jersey Users mailing list elicited some quick responses with clear instructions on how to use Jersey outside of an IDE.

Here's step by step instruction on how to implement a Hello World REST Web Service. This post assumes that you are using Eclipse with the Maven 2 plugin and using Glassfish V2 and Jersey 0.4-ea release. Jersey is still an evolving spec and so these steps might very well change in the future.

First download Jersey and unzip the file. The 0.4-ea version of the Jersey libraries are not available on the maven site though the older versions are. So you have to install the Jersey libraries (jersey.jar, jsr311-api.jar, jettison-1.0-RC1.jar) into a local maven repository.

Create a new Maven2 project called restapp in Eclipse with the following folder structure

src/main/java
src/main/webapp
src/main/webapp/WEB-INF

Edit the maven pom.xml file so it looks something like below:

<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi=\"http://www.w3.org/2001/XMLSchema-instance\" schemalocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">

<modelversion>4.0.0</modelversion>

<groupId>restapp</groupId>

<artifactId>restapp</artifactId>

<packaging>war</packaging>

<version>1.0.0</version>

<build>

<plugins>

<plugin>

<artifactid>maven-compiler-plugin</artifactid>

<configuration>

<source>1.5</source>

<target>1.5</target>

</configuration>

</plugin>

<plugin>

<artifactid>maven-source-plugin</artifactid>

<executions>

<execution>

<goals>

<goal>jar</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

<repositories>

<repository>

<id>MyMavenRepo</id>

<name>MyMavenRepo</name>

<url>http://myserver/maven</url>

</repository>

<repository>

<id>Ibiblio</id>

<name>Ibiblio</name>

<url>http://www.ibiblio.org/maven</url>

</repository>

<repository>

<id>java.net</id>

<url>

https://maven-repository.dev.java.net/nonav/repository

</url>

<layout>legacy</layout>

</repository>

</repositories>

<dependencies>

<dependency>

<groupid>net.sf.json-lib</groupid>

<artifactid>json-lib</artifactid>

<version>0.9</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupid>javax.ejb</groupid>

<artifactid>ejb-api</artifactid>

<version>3.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupid>javax.j2ee</groupid>

<artifactid>j2ee</artifactid>

<version>1.5</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupid>jersey</groupid>

<artifactid>jersey</artifactid>

<version>0.4-ea</version>

</dependency>

<dependency>

<groupid>javax.ws.rs</groupid>

<artifactid>jsr311-api</artifactid>

<version>0.4-ea</version>

</dependency>

<dependency>

<groupid>org.codehaus.jettison</groupid>

<artifactid>jettison</artifactid>

<version>1.0-RC1</version>

</dependency>

<dependency>

<groupid>rome</groupid>

<artifactid>rome</artifactid>

<version>0.8</version>

</dependency>

</dependencies>

</project>

Depending on how you installed the downloaded Jersey libraries into your local repository you might have to fix the pom.xml correctly. Also you might not need some of the other libraries I've listed in the pom.xml. I had them anyway because I needed those to make some EJB lookups.

Create a new file web.xml in the src/main/webapp/WEB-INF folder with the following contents

<web-app>



<servlet>

<servlet-name>Jersey Web Application</servlet-name>

<servlet-class>

com.sun.ws.rest.spi.container.servlet.ServletContainer

</servlet-class>

<init-param>

<param-name>webresourceclass</param-name>

<param-value>

rest.resources.RootResources

</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>



<servlet-mapping>

<servlet-name>Jersey Web Application</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

</web-app>


Create a Java class called rest.resources.RootResources.java in src/main/java. This class should match the webresourceclass parameter value in the web.xml.

The RootResources.java class should like below:

package rest.resources;

import com.sun.ws.rest.api.core.DefaultResourceConfig;

public class RootResources extends DefaultResourceConfig {

public RootResources() {
super(HelloResource.class);
}

}


Now create the rest.resource.HelloResource.java as below:

package rest.resources;

import javax.ws.rs.HttpMethod;
import javax.ws.rs.ProduceMime;
import javax.ws.rs.UriParam;
import javax.ws.rs.UriTemplate;

// The Java class will be hosted at the URI path "/helloworld"
@UriTemplate("/helloworld")
public class HelloResource {

@HttpMethod("GET")
@ProduceMime("text/plain")
public String sayHello() {
return "Hello World!";
}
}

Now execute the mvn clean package command to package the app as a war. You can deploy the war into Glassfish via the admin console or the autodeploy folder. Make sure there are no deployment error messages logged in the Glassfish server.log file.

Fire up your browser and visit http://localhost:8080/restapp-1.0.0/helloworld to REST easy :)

210 comments:

«Oldest   ‹Older   201 – 210 of 210
Anonymous said...

Awesome blog! Do you have any recommendations for aspiring writers?

I'm planning to start my own website soon but I'm a little lost on everything.
Would you advise starting with a free platform like Wordpress or go for a paid
option? There are so many options out there that I'm totally confused .. Any recommendations? Thanks a lot!

Feel free to surf to my homepage ... twitter hack

Anonymous said...

Attractive section of content. I just stumbled upon your blog
and in accession capital to say that I get in fact loved account your blog posts.
Any way I'll be subscribing for your augment and even I success you access persistently rapidly.

Here is my web blog :: buy phallosan

Anonymous said...

It's very easy to find out any matter on net as compared to books, as I found this article at this web site.

Also visit my website ... breast actives

Anonymous said...

Hi! I know this is kinda off topic however
, I'd figured I'd ask. Would you be interested in exchanging links or maybe guest writing a blog post or vice-versa?
My website addresses a lot of the same topics as yours and I think we could greatly
benefit from each other. If you might be interested feel free to send me an e-mail.
I look forward to hearing from you! Awesome blog by the way!


My blog; psn codes

Anonymous said...

Wonderful items from you, man. I've consider your stuff prior to and you are just too excellent. I really like what you've got right here,
really like what you are stating and the way in which you are saying it.
You are making it enjoyable and you continue to care for to stay it smart.
I can't wait to learn far more from you. That is actually a great website.

Visit my web-site - virtapay Currency

Anonymous said...

I'm really impressed with your writing skills as well as with the layout on your weblog. Is this a paid theme or did you customize it yourself? Either way keep up the nice quality writing, it is rare to see a great blog like this one nowadays.

Look into my site ... phen375 in stores

Anonymous said...

These information make us believe that used
cars lancaster pa 3 release date could be somewhere in June 2015 or 2016 nothing official at this moment.
It is really hard to get something like Mercedes Benz G-Class SUV.
Car is not just a whim; it is a world market.


Feel free to surf to my weblog: used cars cars

Anonymous said...

Remarkable іssues here. I am ѵerу happу to ѕee your
articlе. Thanks ѕo much and I'm having a look forward to touch you. Will you please drop me a e-mail?

Also visit my web site ... coffee pure cleanse amazon

Anonymous said...

Thank you for sharing your info. I truly appreciate your efforts and I will be waiting for your further write
ups thank you once again.

Feel free to surf to my web blog: Dragon On Dragonvale

Anonymous said...

Hey there! Do you know if they make any plugins to help with Search Engine Optimization?
I'm trying to get my blog to rank for some targeted keywords but I'm not seeing very good
success. If you know of any please share.
Many thanks!

Here is my web site - buy idol lip (buyidollips.beep.com)

«Oldest ‹Older   201 – 210 of 210   Newer› Newest»