Jersey ExceptionMapper (standard exceptions) in RESTful web Service (java/ example)

  • In this post, we will discuss jersey exception mappers to catch standard exceptions.
  • Exception handling is need of our applications. The jersey ExceptionMapper provides the cross cutting concern.
    • We can able to catch all application exception at one place. we do not need to handle the exceptions in each and every function.
  • We have discussed about user defined exceptions in Jersey ExceptionMapper Example.
  • In this post, we will throw and catch following standard exceptions.
    1. NullPointerException
    2. ArithmeticException
    3. Index out of bound (StringIndexOutOfBoundsException)
  • We will write exception mapper for NullPointerExceptionArithmeticException
    • i.e. NullPointerExceptionMapper  & ArithmeticExceptionMapper.
  • We will write generic ApplicationExceptionMapper, which will catch all application exceptions includingStringIndexOutOfBoundsException.

Jersey maven dependency

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet</artifactId>
 <version>2.23.2</version>
</dependency>

Web.xml – jersey RESTful web Service in java

<?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"
         id="WebApp_ID" version="3.0">

  <display-name>REST Web Application using Jersey framework</display-name>

  <servlet>
    <servlet-name>rest-server</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>org.learn</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>rest-server</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

Program – ExceptionMapper in RESTFul web service (jersey/java/example).

1.) ExpResource class:

  • We have create REST resource, capable of exposing GET APIs.
  • We are throwing following exceptions from REST resources.
    1. NullPointerException
    2. ArithmeticException
    3. Index out of bound (StringIndexOutOfBoundsException)
  • The exceptions will be caught by exceptionmapper classes.
package org.learn.resource;

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


@Path("/exp")
public class ExpResource {

 @GET 
 @Path("outofbound")
 public Response indexOutOfBoundException() {
  String indexOutOfBound = "hello";
  //It will raise index out of bound exception
  indexOutOfBound.charAt(indexOutOfBound.length());
  return  Response.status(Response.Status.OK).build();
 }
 @GET 
 @Path("nullp")
 public Response nullPointerException() {
  throw new NullPointerException("Throwing null pointer exception");
 }
 
 @GET 
 @Path("dividebyzero")
 public Response divideByZero() {
  int divByZero = 100 / 0;
  System.out.println(divByZero);
  return Response.status(Response.Status.OK).build();
 } 
}

2.) NullPointerExceptionMapper class: 

  • NullPointerExceptionMapper  class catch NullPointerExceptions thrown by our application.
package org.learn.exception;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class NullPointerExceptionMapper implements ExceptionMapper<NullPointerException> {

    @Override
    public Response toResponse(NullPointerException e) {
        
        return Response
                .status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .type(MediaType.TEXT_PLAIN)
                .entity("Catching NullPointerExceptionMapper : "+ e.getMessage())
                .build();
    }
}

3.) ArithmeticExceptionMapper class:

  • ArithmeticExceptionMapper class catch ArithmeticException thrown by our application
  • In ExpResource, we are throwing arithmetic exception (divide by zero).
    • ArithmeticExceptionMapper  will catch ArithmeticException.
package org.learn.exception;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class ArithmeticExceptionMapper implements ExceptionMapper<ArithmeticException> {

    @Override
    public Response toResponse(ArithmeticException e) {
        
        return Response
                .status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .type(MediaType.TEXT_PLAIN)
                .entity("Catching ArithmeticExceptionMapper : "+ e.getMessage())
                .build();
    }
}

4.) ApplicationExceptionMapper class:

  • ApplicationExceptionMapper class is capable of handling all exceptions, which are inherited for Exception class.
  • In ExpResource class, we are throwing index out of bound exception.
package org.learn.exception;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class ApplicationExceptionMapper implements ExceptionMapper<Exception> {

    public Response toResponse(Exception e) {
        return Response
                .status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .type(MediaType.TEXT_PLAIN)
                .entity("Catching ApplicaitonExceptionMapper : " + e.getMessage())
                .build();
    }
}

Dependencies: The dependencies defined in our pom file is as follows.

       
  
   junit
   junit
   3.8.1
   test
    
  
  
   org.glassfish.jersey.containers
   jersey-container-servlet
   ${jersey_version}
  
  
   org.glassfish.jersey.core
   jersey-client
   ${jersey_version}
  
  
   javax.servlet
   javax.servlet-api
   ${servlet_api_version}
  
 

Output – ExceptionMapper in RESTFul web service (Jersey /Java/ Example).

  • We have deployed our application at context root.
  • We have used Chrome browser to raise request to our resource.
  • As we have three method defined in our resource class, we have capture their request response as follows.
  1. Request : http://localhost:9095/exp/outofbound
    Response : Catching in ApplicaitonExceptionMapper : String index out of range: 5
  2. Request : http://localhost:9095/exp/nullp
    Response : Catching in NullPointerExceptionMapper : Throwing null pointer exception
  3. Request : http://localhost:9095/exp/dividebyzero
    Response : Catching in ArithmeticExceptionMapper : / by zero

Download code – RESTFul web service Jersey ExceptionMapper Example

 

 

Scroll to Top