JAX-RS @Path URI Matching Example

In JAX-RS, you can use @Path annotation to bind URI pattern to a Java method. In this example we will learn how to use the @Path in a JAX-RS RESTful service to direct user to different methods based on the values passed in the URI.

Folder Structure

  1. Create a Dynamic Web Project RestfulExample and create a package for our src files “com.javainterviewpoint
  2. Place the required jar files under WEB-INF/Lib 

    jersey-bundle-1.18.jar
    asm-3.1.jar

  3. Create the Java classes UserLogin.java and HelloWorld.java under  com.javainterviewpoint folder.
  4. Place the web.xml  under the WEB-INF directory

Simple URI Matching

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/login")
public class UserLogin 
{
	@GET
	public Response normalUser()
	{
		return Response.status(200).
				entity("Normal user has logged in").build();
	}
	
	@GET
	@Path("/memeber")
	public Response memberLogin()
	{
		return Response.status(200).
				entity("Registered user has logged in").build();
	}
}

When you hit on the URI “http://localhost:8080/RestfulExample/rest/login”, you will directed to the normalUser() method

Normal user has logged in

But when you hit on URI “http://localhost:8080/RestfulExample/rest/login/member”, you will directed to the memerLogin() method

Registered user has logged in

Parametrized URI Matching

It works the same ways as the normal URI matching but it is not restricted to /hello alone. The user can put any form of URI after /hello , the method will parse the URI and act accordingly. Here the user has passed “username” which we will parse using the @PathParam{parameter_name} annotation and the value of the parameter will be available to the method through “String name”.

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("hello")
public class HelloWorld
{
	@GET
	@Path("{username}")
	public Response welcome(@PathParam("username")String name)
	{
		return Response.status(200).
				entity("Welcome to hello world program "+name).build();
	}
}

When you hit on the URI “http://localhost:8080/RestfulExample/rest/hello/JavaInterviewPoint” you will get the below output

Welcome to hello world program JavaInterviewPoint

Regular Expression URI Matching

When you want to bind your method to specific form of URI, then you can use regular expression to achieve it. For example if you want the username to have only the characters and not numbers in it then we can use regular expression to filter it out.

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("hello")
public class HelloWorld
{
	@GET
	@Path("/username/{username : [a-zA-Z]+}")
	public Response welcome(@PathParam("username")String name)
	{
		return Response.status(200).
				entity("Welcome to hello world program "+name).build();
	}
	
	@GET
	@Path("/id/{id :\\d+}")
	public Response getId(@PathParam("id")int id)
	{
		return Response.status(200).
				entity("ID Entered : "+id).build();
	}
}

When you hit on the URI “http://localhost:8080/RestfulExample/rest/hello/username/JavaInterviewPoint” you will get the below output

Welcome to hello world program JavaInterviewPoint

But for “http://localhost:8080/RestfulExample/rest/hello/username/JavaInterviewPoint123”

Page cannot be displayed will be returned

as we have made a regex to support character only Same way when you hit “http://localhost:8080/RestfulExample/rest/hello/id/1234”
you get a output

ID Entered : 1234

But for“http://localhost:8080/RestfulExample/rest/hello/id/1234java”

Page cannot be displayed will be returned

as we have made a regex to support numbers only for getId() method

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/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_ID" version="2.4">
 <display-name>Restful 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>com.javainterviewpoint</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>

We register our jersey container “com.sun.jersey.spi.container.servlet.ServletContainer” in the servlet-class of our web.xml and we will mention the source files location as the value to the init param “com.sun.jersey.config.property.packages” so that the container will scan for annotations of the class files within that package.

Leave a Reply

Your email address will not be published. Required fields are marked *