SpringBoot中的全局异常处理你确定你真的知道吗?

本文详细介绍了SpringBoot的默认异常处理机制,包括错误页面的静态和动态定制,自定义异常数据,自定义视图解析,以及@ControllerAdvice注解在处理异常中的应用。讲解了如何实现自定义ErrorAttributes和ErrorViewResolver,以及如何处理不同类型的异常响应。
摘要由CSDN通过智能技术生成

本篇要点

  • 介绍SpringBoot默认的异常处理机制。
  • 如何定义错误页面。
  • 如何自定义异常数据。
  • 如何自定义视图解析。
  • 介绍@ControllerAdvice注解处理异常。

一、SpringBoot默认的异常处理机制

默认情况下,SpringBoot为以下两种情况提供了不同的响应方式:

  1. Browser Clients浏览器客户端:通常情况下请求头中的Accept会包含text/html,如果未定义/error的请求处理,就会出现如下html页面:Whitelabel Error Page,关于error页面的定制,接下来会详细介绍。

 

  1. Machine Clients机器客户端:Ajax请求,返回ResponseEntity实体json字符串信息。
{    "timestamp": "2020-10-30T15:01:17.353+00:00",    "status": 500,    "error": "Internal Server Error",    "trace": "java.lang.ArithmeticException: / by zero...",    "message": "/ by zero",    "path": "/"}

SpringBoot默认提供了程序出错的结果映射路径/error,这个请求的处理逻辑在BasicErrorController中处理,处理逻辑如下:

// 判断mediaType类型是否为text/html@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {    HttpStatus status = getStatus(request);    Map<String, Object> model = Collections        .unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));    response.setStatus(status.value());    // 创建ModelAndView对象,返回页面    ModelAndView modelAndView = resolveErrorView(request, response, status, model);    return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);}@RequestMappingpublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {    HttpStatus status = getStatus(request);    if (status == HttpStatus.NO_CONTENT) {        return new ResponseEntity<>(status);    }    Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));    return new ResponseEntity<>(body, status);}

二、错误页面的定制

相信Whitelabel Error Pag页面我们经常会遇到,这样体验不是很好,在SpringBoot中可以尝试定制错误页面,定制方式主要分静态和动态两种:

  1. 静态异常页面

在classpath:/public/error或classpath:/static/error路径下定义相关页面:文件名应为确切的状态代码,如404.html,或系列掩码,如4xx.html。

举个例子ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值