在本教程中,我们向您展示了如何在Spring MVC框架中进行异常处理。 通常情况下,我们使用@ExceptionHandler来决定在出现某种异常时应该返回哪个“视图”。
这个@ExceptionHandler类自Spring 3.0起可用
1.项目结构
查看项目目录结构,一个标准的Maven项目。
2. 自定义 Exception
自定义异常,包含自定义错误代码和错误描述。
CustomGenericException.javapackage 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
Spring控制器,请查看下面的执行流程:如果用户提供 a /error 请求,它将抛出“CustomGenericException”,并且handleCustomException()方法将被触发。
如果用户提供 a /io-error 请求,它将抛出“IOException”,handleAllException()方法将被触发。
MainController.javapackage 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/index.jsp
Spring MVC @ExceptionHandler Example
${msg}
pages/error/generic_error.jsp
${errCode} : System Errors
System Errors
${errMsg}
5. 测试
回顾以下3个测试用例:
1. http://localhost:8080/SpringMvcExample/anything
2. http://localhost:8080/SpringMvcExample/error
3. http://localhost:8080/SpringMvcExample/io-error
6. @ControllerAdvice 示例
上面的@ExceptionHandler例子只适用于单个控制器,全局应用(所有控制器),用@ControllerAdvice注释一个类。
GlobalExceptionController.javapackage 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. 下载源码
参考
译文地址:http://www.mkyong.com/spring-mvc/spring-mvc-exceptionhandler-example/