异常处理页面是什么原因(异常的处理)
今天来一起学习一下Spring Boot中的异常处理,在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示。
默认情况下,Spring Boot为两种情况提供了不同的响应方式。
一种是浏览器客户端请求一个不存在的页面或服务端处理发生异常时,一般情况下浏览器默认发送的请求头中Accept: text/html,所以Spring Boot默认会响应一个html文档内容,称作“Whitelabel Error Page”。
另一种是使用Postman等调试工具发送请求一个不存在的url或服务端处理发生异常时,Spring Boot会返回类似如下的Json格式字符串信息。
{
"timestamp": "2021-07-04T10:59:59.323+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/helloworld2"
}
如果在Postman的请求头中添加Accept: text/html,也可以获得浏览器中的类似结果,如图所示。
原理也很简单,Spring Boot 默认提供了程序出错的结果映射路径/error。这个/error请求会在BasicErrorController中处理,其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自客户端浏览器(浏览器通常默认自动发送请求头内容Accept:text/html)还是客户端接口的调用,以此来决定返回页面视图还是 JSON 消息内容。
相关BasicErrorController中代码如下:
可见BasicErrorController是一个控制器,对/error进行处理。
BasicErrorController根据Accept头的内容,输出不同格式的错误响应。比如针对浏览器的请求生成html页面,针对其它请求生成JSON格式的内容返回。
Spring Cloud Alibaba微服务实战技术专栏,从项目实践出发,包括Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Log日志、分布式全局唯一ID、DDD领域驱动设计等等技术内容,可帮助你对Spring Cloud 微服务技术栈有更加全面和直观的了解。相信你通过本专栏的练习和实践,能够学以致用,提升微服务应用的开发能力。
二、如何自定义错误页面Spring Boot默认使用嵌入式Tomcat,默认没有页面来处理404等常见错误。因此,为了给用户最佳的使用体验,我们可以自定义错误处理逻辑。
下面我们自定义ErrorController来实现对错误的处理,不管是浏览器还是Postman请求,都统一返还自定义的JSON格式。
MyErrorController代码如下所示:
@RestController
public class MyErrorController implements ErrorController {
private static final String ERROR_PATH = "error";
private ErrorAttributes errorAttributes;
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@Autowired
public MyErrorController(ErrorAttributes errorAttributes) {
this.errorAttributes = errorAttributes;
}
@RequestMapping(ERROR_PATH)
public Map<String, Object> errorHandler(HttpServletRequest request, HttpServletResponse response){
ServletWebRequest webRequest = new ServletWebRequest(request);
Map<String, Object> attr = this.errorAttributes.getErrorAttributes(webRequest, true);
return attr;
}
}
实现ErrorController接口,重写getErrorPath方法。
访问一个不存在的端点,如图所示,通过浏览器和Postman访问都返回相同的JSON数据。
通过Postman发起请求,返回结果如下所示: