springboot错误信息处理机制
★ 在一个web项目中,总需要对一些错误进行界面或者json数据返回,已实现更好的用户体验,springboot中提供了对于错误处理的自动配置
”
errormvcautoconfiguration这个类存放了所有关于错误信息的自动配置。
1. springboot处理错误请求的流程
访问步骤:
- 首先客户端访问了错误界面。例:404或者500
- springboot注册错误请求/error。通过errorpagecustomizer组件实现
- 通过basicerrorcontroller处理/error,对错误信息进行了自适应处理,浏览器会响应一个界面,其他端会响应一个json数据
- 如果响应一个界面,通过defaulterrorviewresolver类来进行具体的解析。可以通过模板引擎解析也可以解析静态资源文件,如果两者都不存在则直接返回默认的错误json或者错误view
- 通过defaulterrorattributes来添加具体的错误信息
源代码
//错误信息的自动配置
public class errormvcautoconfiguration {//响应具体的错误信息@beanpublic defaulterrorattributes errorattributes() {return}//处理错误请求@beanpublic basicerrorcontroller basicerrorcontroller() {return }//注册错误界面@beanpublic errormvcautoconfiguration.errorpagecustomizer errorpagecustomizer() {return }
//注册错误界面,错误界面的路径为/error
private static class errorpagecustomizer implements errorpageregistrar, ordered {//服务器基本配置private final serverproperties properties;public void registererrorpages(errorpageregistry errorpageregistry) {//获取服务器配置中的错误路径/errorerrorpage errorpage = new errorpage(this.dispatcherservletpath.getrelativepath(this.properties.geterror().getpath()));//注册错误界面errorpageregistry.adderrorpages(new errorpage[]{errorpage});} //this.properties.geterror()
public class serverproperties{//错误信息的配置文件private final errorproperties error = new errorproperties();
}//getpath
public class errorproperties {@value("${error.path:/error}")private string path = "/error";
//处理/error请求,从配置文件中取出请求的路径
@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
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);}//其他客户端行为处理,返回一个json数据@requestmappingpublic responseentity