生活随笔
收集整理的這篇文章主要介紹了
SpringBoot异常处理ErrorController详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 一、背景
- 二、SpringBoot的默認(rèn)異常處理BasicErrorController
- 三、自定義錯(cuò)誤異常
寫在前面:
我是「境里婆娑」。我還是從前那個(gè)少年,沒有一絲絲改變,時(shí)間只不過是考驗(yàn),種在心中信念絲毫未減,眼前這個(gè)少年,還是最初那張臉,面前再多艱險(xiǎn)不退卻。
寫博客的目的就是分享給大家一起學(xué)習(xí)交流,如果您對(duì) Java感興趣,可以關(guān)注我,我們一起學(xué)習(xí)。
前言:ErrorController是SpringBoot調(diào)用Controller出錯(cuò)時(shí)的一個(gè)統(tǒng)一處理接口,它的實(shí)現(xiàn)為BasicErrorController。
一、背景
使用SpringBoot調(diào)用controller時(shí),如果系統(tǒng)出現(xiàn)404,405,500等這種報(bào)錯(cuò)信息時(shí),系統(tǒng)默認(rèn)會(huì)展示如下信息:
如果把這種錯(cuò)誤展示給用戶看,對(duì)于用戶來(lái)說是不友好的。對(duì)于這種報(bào)錯(cuò)信息,我們需要做統(tǒng)一處理,我們根據(jù)不同的錯(cuò)誤類型,返回給用戶不同的返回信息。SpringBoot就提供了一個(gè)這樣統(tǒng)一處理異常的接口類ErrorController。下面我們簡(jiǎn)單說明一下如何實(shí)現(xiàn)一個(gè)自定義的異常處理機(jī)制。
二、SpringBoot的默認(rèn)異常處理BasicErrorController
在看了源碼之后發(fā)現(xiàn)有一個(gè)配置類ErrorMvcAutoConfiguration,當(dāng)工程啟動(dòng)的時(shí)候,已經(jīng)把BasicErrorController加載到Spring容器里面。因此當(dāng)我們程序報(bào)錯(cuò)的時(shí)候會(huì)直接調(diào)用這個(gè)處理異常的controller。
錯(cuò)誤地址配置:
看完源碼,我們發(fā)現(xiàn)如果你在配置文件配置了server.error.path的話,就會(huì)使用你配置的異常處理地址,如果沒有就會(huì)使用你配置的error.path路徑地址,如果還是沒有,默認(rèn)使用/error來(lái)作為發(fā)生異常的處理地址。
BasicErrorController這兩個(gè)方法是關(guān)鍵
- getErrorPath()錯(cuò)誤頁(yè)路徑
- errorHtml()返回錯(cuò)誤頁(yè)信息
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
);}
三、自定義錯(cuò)誤異常
通過研究BasicErrorController,我們自定義錯(cuò)誤異常需要實(shí)現(xiàn)ErrorContrroller大概需要四點(diǎn)。
- 實(shí)現(xiàn)ErrorController接口,并重寫getErrorPath()方法,指定異常跳轉(zhuǎn)的url;
- 對(duì)類添加@RestController注解,添加異常跳轉(zhuǎn)url的Controller;
- 獲取請(qǐng)求響應(yīng)的類型,針對(duì)不同的響應(yīng)錯(cuò)誤類型,做不同的邏輯處理。
- 在template目錄下存放錯(cuò)誤頁(yè)面的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("獲取當(dāng)前HttpStatus發(fā)生異常", ex
);return HttpStatus.INTERNAL_SERVER_ERROR
;}}@Overridepublic String getErrorPath() {return "";}
}
以上就是SpringBoot異常處理ErrorController詳解,如果大家喜歡請(qǐng)一鍵三連。
總結(jié)
以上是生活随笔為你收集整理的SpringBoot异常处理ErrorController详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。