欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > javascript >内容正文

javascript

springboot异常处理errorcontroller详解 -凯发k8官方网

发布时间:2025/1/21 javascript 16 豆豆
凯发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;/*** 初始化exceptioncontroller** @param errorattributes*/@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());// 404拦截规则,如果是静态文件发生的404则不记录到dbmap<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);}/*** determine if the stacktrace attribute should be included.** @param request* the source request* @param produces* the media type produced (or {@code mediatype.all})* @return if the stacktrace attribute should be included*/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);}/*** 获取错误的信息** @param webrequest* @param includestacktrace* @return*/private map<string, object> geterrorattributes(webrequest webrequest,boolean includestacktrace) {return this.errorattributes.geterrorattributes(webrequest, includestacktrace);}/*** 是否包含trace** @param request* @return*/private boolean gettraceparameter(httpservletrequest request) {string parameter = request.getparameter("trace");return parameter != null && !"false".equalsignorecase(parameter);}/*** 获取错误编码** @param request* @return*/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;}}/*** 实现错误路径,暂时无用** @return*/@overridepublic string geterrorpath() {return "";} }

以上就是springboot异常处理errorcontroller详解,如果大家喜欢请一键三连。

总结

以上是凯发k8官方网为你收集整理的springboot异常处理errorcontroller详解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图