Springboot-16错误处理

1、默认处理

当访问页面时是返回404,500等错误信息

  • 默认情况下,Spring Boot提供/error处理所有错误的映射。
  • 如果是浏览器请求URL错误,返回错误页面;如果是postman等非浏览器客户端请求URL错误,返回 json 数据。

浏览器客户端在这里插入图片描述
机器客户端
在这里插入图片描述

2、自定义
  • 要对其进行自定义,添加View解析为error,自动寻找error下的错误处理匹配;
  • error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页。
    在这里插入图片描述
  • 注意:
    html文件要引入模板引擎;
    拦截器放开静态资源;

如果在 templates/error 目录下有自定义的 4xx 或 5xx 页面,则使用此页面;

如果templates/error 目录下没有自定义的错误页面:在 static/error 目录下寻找 4xx 或 5xx 页面,如果找到则使用;

如果 templates/error目录和 static/error目录都没有自定义的 4xx 或 5xx 页面 ,则使用 SpringBoot默认的错误页面

3、源码
@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class BasicErrorController extends AbstractErrorController {
    // 浏览器:
    @RequestMapping( produces = {"text/html"} )
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        HttpStatus status = this.getStatus(request);
        // 在这里填充返回的属性值
        Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());
        // 在这里填充返回的页面
        ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
        return modelAndView != null ? modelAndView : new ModelAndView("error", model);
    }
 
    // 其他客户端: 
    @RequestMapping
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        // 在这里填充返回的属性值
        Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = this.getStatus(request);
        return new ResponseEntity(body, status);
    }
 
    /* SpringBoot返回错误信息的两种方式都是用getErrorAttributes()方法来给map赋值 */
}
 
 
public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {
     private ModelAndView resolve(String viewName, Map<String, Object> model) {
        // 默认去找到error/下的错误页面
        String errorViewName = "error/" + viewName;
        // 模板引擎寻找错误页面代码
        TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);
        return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值