Spring提供了多种方式将异常转换为响应
- 特定的Spring异常将会自动映射为指定的HTTP状态码
- 异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码
- 在方法上可以添加@ExceptionHandler注解,使其用来处理异常
1. 将异常映射为HTTP状态码
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Not Found")
public MyException extends RuntimeException {
}
如果控制器抛出MyException 异常,响应将会具有404状态码
2. 编写异常处理的方法
@ExceptionHandler(MyException.class)
public String handleMyException() {
...
}
只能处理所在控制器类内抛出的所有MyException异常#
3. 为控制器添加通知
控制器通知是任意带有@ControllerAdvice
注解的类,这个类会包含一个或多个如下类型的方法
@ExceptionHandler
注解标注的方法@InitBinder
注解标注的方法@ModelAttribute
注解标注的方法
这些方法会运用到整个应用的所有有控制器中带@RequestMapping
的方法
@ControllerAdvice
本身已经使用了@Component
,可以被扫描到
//处理所有控制器类的MyException异常
@ExceptionHandler({MyException.class})
public String handleMyException() {
return "error";
}
//或
@ExceptionHandler({MyException.class})
public ModelAndView handleMyException() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("flag", "MyException");
return modelAndView;
}
//把值绑定到Model中,使全局@RequestMapping可以获取到该值
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("name", "wang");...
}
········································································
@RequestMapping("/profile")
public String profile(Model model) {
modelMap.get("name");...
}
//或
@RequestMapping("/profile")
public String profile(@ModelAttribute("name") String name) {
name;...
}