springboot中自定义错误页面的方法:
1、在templates目录下创建一个error目录,然后错误页面以状态码命名。
比如:当发生404错误时,会使用error/404.html页面作为错误页面,500错误则使用error/500.html作为错误页面返回。。。还可以使用通配符,比如4xx.html页面,以4开头的错误状态码都会使用4xx.html作为错误页面,当然,如果404.html与4xx.html同时存在,优先使用有明确名字的404.html
2、当然,模板引擎是使用springboot中配置的那个,如果使用jsp作为模板引擎,那后缀不是html,而是jsp。不过,建议使用thymeleaf,官方推荐嘛
3.为什么是使用templates/error下的页面作为错误页面呢?
因为springboot的模板默认就在classpath:/templates/下,而错误页面是都是forward:/error,交给/error请求映射处理,即BasicErrorController控制器,该控制器使用ErrorViewResolver解析,解析出来的view的viewName是/error/+statusCode,
而statusCode状态码是通过下面这句话获取
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
如果用户要指定错误状态码,有四种方法,
1、只需要设置请求的javax.servlet.error.status_code属性即可,就是上面那句。
2、也可以使用@ResponseStatus注释在指定的异常类上,当抛出这个异常时,springmvc检测到该异常类上有@ResponseStatus注解,则会把错误码改为@ResponseStatus指定的。只要状态码不是200,那么就都会把请求转发给错误页面处理。
3、@ResponseStatus还可以标注在@ExceptionHandler方法上,该异常处理方法被springmvc调用时,也会把状态码修改为@ResponseStatus所指定的。只要状态码不是200,那么就都会把请求转发给错误页面处理。
4、@ResponseStatus可以标注在@RequestMapping方法上,不过只要请求映射并调用该RequestMapping方法,那么状态码就都会修改为@ResponseStatus所指定的。只要状态码不是200,那么就都会把请求转发给错误页面处理。
默认在错误页面可以获取到的数据:
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
自定义错误信息,自适应浏览区与其他客户端(即对浏览器返回页面,对其他客户端返回json数据):
出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由
getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);
1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
最好不要这么做,因为默认的ErrorController为BasicErrorController,该Controller默认实现了很多功能,如果我们自己重写了,那么这些功能可能会失效,比如 :
在使用了模板引擎的情况下,把错误页面的视图转发到templates的error/4xx.html页面就不会成功。
2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;
容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;
自定义ErrorAttributes
(建议使用这种方式)
//给容器中加入我们自己定义的ErrorAttributes
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,boolean includeStackTrace) {
//这里的map中已经包含了timestamp, status, error, exception, message, errors几个key-value
Map<String, Object> map = super.getErrorAttributes(requestAttributes,includeStackTrace);
//只要把自定义的错误信息添加到这个map中,在页面中就可以通过$获取了,
//比如下面的company在错误页面中就可以通过${company}获得
map.put("company","atguigu");
return map;
}
}
最终的效果:响应是自适应的(在BasicErrorController实现的错误请求响应),可以通过定制ErrorAttributes改变需要返回的内容,