默认异常处理机制
1、Whitelabel Error Page
当客户端访问页面不存在,或服务端处理发生异常,一般浏览器客户端发送的请求头中为:Accept:text/html;所以就返回一个html文档。
这里有一个很重要的类:BasicErrorController,对于比较复杂的自定义要求,可以继承该类,定义相应的ModelAndView。
2、用Postman等调试工具发送一个不存在的URL;或返回一个json字符串:
{
"timestamp": "2018-05-12T06:11:45.209+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/index.html"
}
自定义错误页面
优先级:
1、error.html会覆盖默认的 whitelabel Error Page 错误提示
2、静态错误页面优先级别比error.html高
3、动态模板错误页面优先级比静态错误页面高
注意:对与高级复杂的错误覆盖:
1、现在配置类中配置:
EmbeddedServletContainerCustomizer类,重写customize方法,
@Configuration
public class ContainerConfig {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
}
};
}
}
将产生的异常错误请求进行转发,转发到的新映射,可以看成访问路径,在Controller类的方法中作为输入的值,也就是@RequestMapping的value。
@ControllerAdvice处理异常
上文中的BasicErrorController继承了AbstractErrorController,后者又实现了ErrorController接口,所以源头是ErrorController,这是一种全局性的容错机制。
此外,还有以下两个注解可以对指定异常进行特殊处理:主要是高亮的注解,这个注解用在方法上。
1、局部异常处理:@Controller+@ExceptionHandler
2、全局异常处理:@ControllerAdvice+@ExceptionHandler
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。
?标亮的是啥???
搞明白了:所以ModelAndView视图对象的setViewName方法的名字,就是资源的存放路径。