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