springboot配置mvc自定义错误页面以及json错误信息

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改变需要返回的内容,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值