Spring MVC @ExceptionHandler Example

摘要: In this tutorial, we show you how to do exception handling in Spring MVC frameworks. Normally, we use @ExceptionHandler to decide which “view” should be returned back if certain exception is raised.

In this tutorial, we show you how to do exception handling in Spring MVC frameworks. Normally, we use @ExceptionHandler to decide which “view” should be returned back if certain exception is raised.

P.S This @ExceptionHandler class is available since Spring 3.0

1. Project Structure

Review the project directory structure, a standard Maven project.

2. Custom Exception

A custom exception, with custom error code and error description.

CustomGenericException.java

package com.mkyong.web.exception;
public class CustomGenericException extends RuntimeException {
	private static final long serialVersionUID = 1L;
	private String errCode;
	private String errMsg;
	public String getErrCode() {
		return errCode;
	public void setErrCode(String errCode) {
		this.errCode = errCode;
	public String getErrMsg() {
		return errMsg;
	public void setErrMsg(String errMsg) {
		this.errMsg = errMsg;
	public CustomGenericException(String errCode, String errMsg) {
		this.errCode = errCode;
		this.errMsg = errMsg;

3. Spring Controller

A Spring controller, review the execution-flows below :

  1. If user provide a /error request, it throws “CustomGenericException”, and the handleCustomException() method will be fired.

  2. If user provide a /io-error request, it throws “IOException”, and the handleAllException() method will be fired.

MainController.java

package com.mkyong.web.controller;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.mkyong.web.exception.CustomGenericException;
@Controller
public class MainController {
	@RequestMapping(value = "/{type:.+}", method = RequestMethod.GET)
	public ModelAndView getPages(@PathVariable("type") String type)
		throws Exception {
	  if ("error".equals(type)) {
		// go handleCustomException
		throw new CustomGenericException("E888", "This is custom message");
	  } else if ("io-error".equals(type)) {
		// go handleAllException
		throw new IOException();
	  } else {
		return new ModelAndView("index").addObject("msg", type);
	@ExceptionHandler(CustomGenericException.class)
	public ModelAndView handleCustomException(CustomGenericException ex) {
		ModelAndView model = new ModelAndView("error/generic_error");
		model.addObject("errCode", ex.getErrCode());
		model.addObject("errMsg", ex.getErrMsg());
		return model;
	@ExceptionHandler(Exception.class)
	public ModelAndView handleAllException(Exception ex) {
		ModelAndView model = new ModelAndView("error/generic_error");
		model.addObject("errMsg", "this is Exception.class");
		return model;

4. JSP Pages

pages/index.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
	<h2>Spring MVC @ExceptionHandler Example</h2>
	<c:if test="${not empty msg}">
		<h2>${msg}</h2>
	</c:if>
</body>
</html>

pages/error/generic_error.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
	<c:if test="${not empty errCode}">
		<h1>${errCode} : System Errors</h1>
	</c:if>
	<c:if test="${empty errCode}">
		<h1>System Errors</h1>
	</c:if>
	<c:if test="${not empty errMsg}">
		<h2>${errMsg}</h2>
	</c:if>
</body>
</html>

5. Testing

Review following 3 test cases :

1. http://localhost:8080/SpringMvcExample/anything

2. http://localhost:8080/SpringMvcExample/error

3. http://localhost:8080/SpringMvcExample/io-error

6. @ControllerAdvice Example

The above @ExceptionHandler example is only apply to a single controller, to apply it globally (all controllers), annotate a class with @ControllerAdvice.

GlobalExceptionController.java

package com.mkyong.web.controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.mkyong.web.exception.CustomGenericException;
@ControllerAdvice
public class GlobalExceptionController {
	@ExceptionHandler(CustomGenericException.class)
	public ModelAndView handleCustomException(CustomGenericException ex) {
		ModelAndView model = new ModelAndView("error/generic_error");
		model.addObject("errCode", ex.getErrCode());
		model.addObject("errMsg", ex.getErrMsg());
		return model;
	@ExceptionHandler(Exception.class)
	public ModelAndView handleAllException(Exception ex) {
		ModelAndView model = new ModelAndView("error/generic_error");
		model.addObject("errMsg", "this is Exception.class");
		return model;

7. Download Source Code

Download – SpringMvc-ExceptionHandler-Example.zip (15 KB)

References

  1. Spring @ExceptionHandler JavaDoc

  2. Spring @ControllerAdvice JavaDoc

  3. Spring MVC Exception Handling Example

上一篇: Jsoup Get favicon from html page
下一篇: Spring MVC and List Example
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号