Author:SimpleWu
默认错误处理机制
SpringBoot默认的错误处理直接回返回对应的错误视图页面。比如404错误。
如果是其它客户端访问,默认相应一个json数据。比如通过postman来访问当前页面。
springboot错误页面处理过程:
SpringBoot的错误信息配置是通过ErrorMvcAutoConfiguration来进行配置的,这个类中帮我们注册了一下组件。
- DefaultErrorAttributes:帮我们在页面上共享错误信息。
- BasicErrorController:处理默认的/error请求。分为两种处理请求的方式,一种是html方式,一种是json方式。
- ErrorPageCustomizer:系统发生错误后,该对象就会生效,来定义请求规则。
- DefaultErrorViewResolver:默认的错误视图解析器,将错误信息解析到相应的错误视图。
处理error请求过程: 一旦系统出现4xx或者 5xx之类的错误, ErrorPageCustomizer就会生效(定义错误的相应规则),就会来到/error请求。就会被BasicErrorController处理。BasicErrorController会根据请求头RequestHeaders中的Accept来区分是浏览器发送的请求还是其它工具发出的请求。分为两个处理方法,一个是errorHtml()和error(),在errorHtml()方法中,获取错误状态信息,由resolveErrorView解析器解析到默认的错误视图页面。错误页面是/error/404.html页面。如果templates中error里面有这个页面404错误就会精确匹配404.html如果没有这个404.html他会模糊匹配4xx.html页面,如果templates中没有找到错误页面,它就会去static文件中找。
页面可以获取的错误信息:
- timestamp:时间戳。
- status:状态码。
- error:错误提示。
- exception:异常对象。
- message:异常消息。
- errors:数据效验相关的信息。
注意:static文件夹存放的是静态页面,它没有办法使用模板引擎表达式
了解了上面的计息过程以后,我们自定义错误就简单了。自定义html错误页面分为两种情况:
有模板引擎的情况下,在templates文件夹下建立一个error文件夹,里面以错误号的方式添加错误页面。我们也可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的其它错误,精确优先。
没有模板引擎的情况下,在静态资源文件夹下添加以错误号命名的错误页面。
自定义异常返回JSON数据
这种异常处理方式没有自适应效果,不论页面还是其它工具都会返回json格式的数据。
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler(RuntimeException.class)
public Map<String,Object> handleException(Exception e){
Map<String,Object> map = new HashMap<>();
map.put("code","user.notexist");
map.put("message",e.getMessage());
return map;
}
}
这种处理方式错误码是500他首先会去模板引擎error中找定制的错误页面,没有就会去静态资源文件中error文件夹去。
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e, HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
//传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
//Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
request.setAttribute("javax.servlet.error.status_code",500);
map.put("code","user.notexist");
map.put("message",e.getMessage());
//转发到/error
return "forward:/error";
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2017-12-18 查找 TextBox 对象中非法数据的示例