Spring MVC handle Exceptions in Controller using @ExceptionHandler
Points To Remember
- You can handle all types of runtime exceptions and custom exceptions using @ExceptionHandler annotation.
- You just need to define the class to the annotation to handle exceptions of that class.
Spring MVC handle Exceptions in Controller
Here we have a simple Spring MVC application with the following.- HomeController wih three actions
- throw1 - throws Custom exception
- throw2 - throws Custom exception
- throw3 - throws Runtime exception
Home Controller
package com.ekiras.controller; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.ekiras.exception.MyException; import com.ekiras.exception.MyGlobalException; @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate ); return "home"; } @RequestMapping(value="/throw1") public String throw1(){ throw new MyException(); } @RequestMapping(value="/throw2") public String throw2(){ throw new MyGlobalException(); } @RequestMapping(value="/throw3") public String throw3(){ throw new RuntimeException(); } @ResponseBody @ExceptionHandler(MyException.class) public String myException(MyException exception){ return "exception caught message="+ exception.getMessage(); } @ResponseBody @ExceptionHandler(MyGlobalException.class) public String myGlobalException(MyGlobalException exception){ return "exception caught message="+ exception.getMessage(); } }
The above code will not catch any Exception of class RuntimeException. If you want to catch it you can add another method like following to your code.
@ResponseBody @ExceptionHandler(Exception.class) public String myGlobalException(Exception exception){ return "exception caught message="+ exception.getMessage(); }
Now, after adding the above code to your controller. Your controller will handle all types of Exceptions.