凯发k8官方网
收集整理的这篇文章主要介绍了
springboot异常处理errorcontroller详解
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- 一、背景
- 二、springboot的默认异常处理basicerrorcontroller
- 三、自定义错误异常
写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 java感兴趣,可以关注我,我们一起学习。
前言:errorcontroller是springboot调用controller出错时的一个统一处理接口,它的实现为basicerrorcontroller。
一、背景
使用springboot调用controller时,如果系统出现404,405,500等这种报错信息时,系统默认会展示如下信息:
如果把这种错误展示给用户看,对于用户来说是不友好的。对于这种报错信息,我们需要做统一处理,我们根据不同的错误类型,返回给用户不同的返回信息。springboot就提供了一个这样统一处理异常的接口类errorcontroller。下面我们简单说明一下如何实现一个自定义的异常处理机制。
二、springboot的默认异常处理basicerrorcontroller
在看了源码之后发现有一个配置类errormvcautoconfiguration,当工程启动的时候,已经把basicerrorcontroller加载到spring容器里面。因此当我们程序报错的时候会直接调用这个处理异常的controller。
错误地址配置:
看完源码,我们发现如果你在配置文件配置了server.error.path的话,就会使用你配置的异常处理地址,如果没有就会使用你配置的error.path路径地址,如果还是没有,默认使用/error来作为发生异常的处理地址。
basicerrorcontroller这两个方法是关键
- geterrorpath()错误页路径
- errorhtml()返回错误页信息
public string geterrorpath() {return this.errorproperties
.getpath();}@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
);}
三、自定义错误异常
通过研究basicerrorcontroller,我们自定义错误异常需要实现errorcontrroller大概需要四点。
- 实现errorcontroller接口,并重写geterrorpath()方法,指定异常跳转的url;
- 对类添加@restcontroller注解,添加异常跳转url的controller;
- 获取请求响应的类型,针对不同的响应错误类型,做不同的逻辑处理。
- 在template目录下存放错误页面的html文件。
@slf4j
@controller
@requestmapping("/error")
@enableconfigurationproperties({serverproperties.class})
public class errorpagescontroller implements errorcontroller {private errorattributes errorattributes
;@autowiredprivate serverproperties serverproperties
;@autowiredpublic errorpagescontroller(errorattributes errorattributes
) {assert.notnull(errorattributes
, "errorattributes must not be null");this.errorattributes
= errorattributes
;}@requestmapping("/404")public modelandview errorhtml404(httpservletrequest request
, httpservletresponse response
, webrequest webrequest
) {response
.setstatus(httpstatus.not_found
.value());map<string, object> model
= geterrorattributes(webrequest
, isincludestacktrace(request
, mediatype.text_html
));model
.put("querystring", request
.getquerystring());return new modelandview("error/404", model
);}@requestmapping("/403")public modelandview errorhtml403(httpservletrequest request
, httpservletresponse response
, webrequest webrequest
) {response
.setstatus(httpstatus.forbidden
.value());map<string, object> model
= geterrorattributes(webrequest
, isincludestacktrace(request
, mediatype.text_html
));model
.put("querystring", request
.getquerystring());if (!string.valueof(model
.get("path")).contains(".")) {model
.put("status", httpstatus.forbidden
.value());}return new modelandview("error/403", model
);}@requestmapping("/400")public modelandview errorhtml400(httpservletrequest request
, httpservletresponse response
, webrequest webrequest
) {response
.setstatus(httpstatus.bad_request
.value());map<string, object> model
= geterrorattributes(webrequest
, isincludestacktrace(request
, mediatype.text_html
));model
.put("querystring", request
.getquerystring());return new modelandview("error/400", model
);}@requestmapping("/401")public modelandview errorhtml401(httpservletrequest request
, httpservletresponse response
, webrequest webrequest
) {response
.setstatus(httpstatus.unauthorized
.value());map<string, object> model
= geterrorattributes(webrequest
, isincludestacktrace(request
, mediatype.text_html
));model
.put("querystring", request
.getquerystring());return new modelandview("error/401", model
);}@requestmapping("/500")public modelandview errorhtml500(httpservletrequest request
, httpservletresponse response
, webrequest webrequest
) {response
.setstatus(httpstatus.internal_server_error
.value());map<string, object> model
= geterrorattributes(webrequest
, isincludestacktrace(request
, mediatype.text_html
));model
.put("querystring", request
.getquerystring());return new modelandview("error/500", model
);}protected boolean isincludestacktrace(httpservletrequest request
,mediatype produces
) {errorproperties.includestacktrace include
= this.serverproperties
.geterror().getincludestacktrace();if (include
== errorproperties.includestacktrace.always
) {return true;}return include
== errorproperties.includestacktrace.on_trace_param
&& gettraceparameter(request
);}private map<string, object> geterrorattributes(webrequest webrequest
,boolean includestacktrace
) {return this.errorattributes
.geterrorattributes(webrequest
, includestacktrace
);}private boolean gettraceparameter(httpservletrequest request
) {string parameter
= request
.getparameter("trace");return parameter
!= null && !"false".equalsignorecase(parameter
);}private httpstatus getstatus(httpservletrequest request
) {integer statuscode
= (integer) request
.getattribute("javax.servlet.error.status_code");if (statuscode
== null) {return httpstatus.internal_server_error
;}try {return httpstatus.valueof(statuscode
);} catch (exception ex
) {log
.error("获取当前httpstatus发生异常", ex
);return httpstatus.internal_server_error
;}}@overridepublic string geterrorpath() {return "";}
}
以上就是springboot异常处理errorcontroller详解,如果大家喜欢请一键三连。
总结
以上是凯发k8官方网为你收集整理的springboot异常处理errorcontroller详解的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。