Monday, 3 December 2018

Spring mvc: Exception handling at controller level

In this post, you are going to learn,
         a. What is the behaviour of spring application, when there is no exception handling mechanism.
         b. How to customise the exception handling process.
        
What is the behaviour of spring application, when there is no exception handling mechanism.
Let’s try to find out with an example. I written handler method 'getHelloMessage' like below.

@RequestMapping("/welcome")
public String getHelloMessage() {
         boolean flag = true;

         if (flag) {
                  throw new RuntimeException("Throwning blindly");
         }

         return "welcome";
}

As you see the definition of 'getHelloMessage' method, it throw RuntimeException in all the cases. Follow below step-by-step procedure and set up the application first.

HelloWorldController.java
package com.sample.myApp.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping("/welcome")
 public String getHelloMessage() {
  boolean flag = true;

  if (flag) {
   throw new RuntimeException("Throwning blindly");
  }

  return "welcome";
 }

}


Create welcome.jsp file under WEB-INF/jsp folder.

welcome.jsp
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello World Spring Web MVC</title>
</head>
<body>
 <h1>
  Hello, Good Morning
 </h1>
</body>
</html>


Create web.xml, HelloWorld-servlet.xml files under WEB-INF folder.

web.xml
<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 MVC Hello WorldApplication</display-name>

 <servlet>
  <servlet-name>HelloWorld</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>HelloWorld</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

</web-app>


HelloWorld-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

 <mvc:annotation-driven />

 <context:component-scan
  base-package="com.sample.myApp" />

 <bean
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>

</beans>

Create index.jsp file under webapp folder.

index.jsp
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>Welcome Page</title>
</head>

<body>
 <h2>Click on below button to get welcome page</h2>
 <form method="post" action="/springdemo/welcome"
  id="form1">

  <input type="submit" value="getWelcomeMessage"
   style="font-size: 18px;" />
 </form>

</body>
</html>
Total project structure looks like below.
Run the application on server, you can able to see below kind of screen.


Click on the button ‘getWelcomeMessage’. You can able to see below kind of screen.
As you see above image, it is displaying complete stack trace and server that is used by the application to run. It doesn’t look good and expose security concerns.


How to customize the exception handling process?
By using @ExceptionHandler annotation, we can redirect to some view page on error cases.

For example, I added below method in HelloWorldController class.

         @ExceptionHandler(RuntimeException.class)
         public String handleRuntimeException() {
                  return "runtimeException";
         }
        
Whenever any run time exception thrown, then runtimeException.jsp file is shown to the user.

Update HelloWorldController class like below.

HelloWorldController.java
package com.sample.myApp.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping("/welcome")
 public String getHelloMessage() {
  boolean flag = true;

  if (flag) {
   throw new RuntimeException("Throwning blindly");
  }

  return "welcome";
 }

 @ExceptionHandler(RuntimeException.class)
 public String handleRuntimeException() {
  return "runtimeException";
 }
}


Create 'runtimeException.jsp' file under WEB-INF/jsp folder.

runtimeException.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 <h1>Run time exception occured. Please contact the Administrator.
 </h1>
</body>
</html>


Run the application on server.
Click on ‘getWelcomeMessage’ button.

You will be redirected to runtimeException.jsp file.





Previous                                                 Next                                                 Home

No comments:

Post a Comment