日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot异常处理ErrorController详解

發(fā)布時間:2025/1/21 javascript 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;/*** 初始化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攔截規(guī)則,如果是靜態(tài)文件發(fā)生的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發(fā)生異常", ex);return HttpStatus.INTERNAL_SERVER_ERROR;}}/*** 實現(xiàn)錯誤路徑,暫時無用** @return*/@Overridepublic String getErrorPath() {return "";} }

以上就是SpringBoot異常處理ErrorController詳解,如果大家喜歡請一鍵三連。

總結

以上是生活随笔為你收集整理的SpringBoot异常处理ErrorController详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。