日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot錯誤處理機制實現(xiàn)原理解析

瀏覽:20日期:2023-05-24 13:13:22

1.默認(rèn)的錯誤機制

默認(rèn)效果

①在瀏覽器中訪問不存在的請求時,springboot默認(rèn)返回一個空白頁面

Springboot錯誤處理機制實現(xiàn)原理解析

瀏覽器的請求頭

Springboot錯誤處理機制實現(xiàn)原理解析

②客戶端訪問時,返回json數(shù)據(jù)

{ 'timestamp': '2020-03-24T02:49:56.572+0000', 'status': 404, 'error': 'Not Found', 'message': 'No message available', 'path': '/'}

客戶端訪問的請求頭

Springboot錯誤處理機制實現(xiàn)原理解析

原理

可以參照 ErrorMvcAutoConfiguration 錯誤處理的自動配置

給容器中添加了以下組件

1.DefaultErrorAttributes

public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map<String, Object> errorAttributes = new LinkedHashMap(); errorAttributes.put('timestamp', new Date()); this.addStatus(errorAttributes, webRequest); this.addErrorDetails(errorAttributes, webRequest, includeStackTrace); this.addPath(errorAttributes, webRequest); return errorAttributes;}

@RequestMapping( produces = {'text/html'} ) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { HttpStatus status = this.getStatus(request); //處理頁面的請求返回給前臺數(shù)據(jù) model 的獲取 ,調(diào)用 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); } //調(diào)用 AbstractErrorController#getErrorAttributes protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { WebRequest webRequest = new ServletWebRequest(request); return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace); } 最終調(diào)用DefaultErrorAttributes#getErrorAttributes public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {

2.BasicErrorController : 處理默認(rèn)的 /error 請求

@Controller@RequestMapping({'${server.error.path:${error.path:/error}}'}) public class BasicErrorController extends AbstractErrorController { private final ErrorProperties errorProperties;public String getErrorPath() { return this.errorProperties.getPath();}@RequestMapping( produces = {'text/html'} //產(chǎn)生html類型的數(shù)據(jù),瀏覽器發(fā)送的請求來到這個方法處理)public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {//獲取狀態(tài)碼 HttpStatus status = this.getStatus(request);//獲取模型數(shù)據(jù) Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML))); response.setStatus(status.value());//去哪個頁面作為錯誤頁面,包括頁面地址和內(nèi)容 ModelAndView modelAndView = this.resolveErrorView(request, response, status, model); return modelAndView != null ? modelAndView : new ModelAndView('error', model);}@RequestMapping //產(chǎn)生json類型的數(shù)據(jù), 其他客戶端發(fā)送的請求來到這個方法處理public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { HttpStatus status = this.getStatus(request); if (status == HttpStatus.NO_CONTENT) { return new ResponseEntity(status); } else { Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL)); return new ResponseEntity(body, status); }}

3.ErrorPageCustomizer

public class ErrorProperties { @Value('${error.path:/error}') private String path = '/error'; //系統(tǒng)出現(xiàn)錯誤請求之后來到 /error 請求進行處理 ,(類似于以前 web.xml 中注冊的錯誤頁面規(guī)則)

4.DefaultErrorViewResolver

public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) { ModelAndView modelAndView = this.resolve(String.valueOf(status.value()), model); if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) { modelAndView = this.resolve((String)SERIES_VIEWS.get(status.series()), model); } return modelAndView; } private ModelAndView resolve(String viewName, Map<String, Object> model) {//默認(rèn) springboot 可以找到這個頁面 error/404 String errorViewName = 'error/' + viewName;//模板引擎可以解析這個頁面地址就用模板引擎解析 TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);//模板引擎可用的情況下就返回到 errorViewName 指定的視圖地址 return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model); }  //模板引擎不可用就在靜態(tài)資源文件夾里面找 errorViewName 對應(yīng)的頁面 error/404.html private ModelAndView resolveResource(String viewName, Map<String, Object> model) { String[] var3 = this.resourceProperties.getStaticLocations(); int var4 = var3.length; for(int var5 = 0; var5 < var4; ++var5) { String location = var3[var5]; try {Resource resource = this.applicationContext.getResource(location);resource = resource.createRelative(viewName + '.html');//如果靜態(tài)資源文件中由 這個資源就直接使用,否則返回為空if (resource.exists()) { return new ModelAndView(new DefaultErrorViewResolver.HtmlResourceView(resource), model);} } catch (Exception var8) { } }  return null; }

步驟:

一旦系統(tǒng)出現(xiàn) 4xx 或者 5xx 之類的錯誤,ErrorPageCustomizer 就會生效(定制錯誤的響應(yīng)規(guī)則),就會來到 /error 請求,會被BasicErrorController

處理。

①響應(yīng)頁面 去哪個頁面由 DefaultErrorViewResolver 決定

protected ModelAndView resolveErrorView(HttpServletRequest request, HttpServletResponse response, HttpStatus status, Map<String, Object> model) { Iterator var5 = this.errorViewResolvers.iterator(); //解析所有的 ErrorViewResolver 得到 modelAndView ModelAndView modelAndView; do { if (!var5.hasNext()) { return null; } ErrorViewResolver resolver = (ErrorViewResolver)var5.next(); modelAndView = resolver.resolveErrorView(request, status, model); } while(modelAndView == null); return modelAndView;}

2.錯誤信息的定制

①如何定制錯誤頁面

1>有模板引擎的情況下: error/狀態(tài)碼 ;【將錯誤頁面命名為 錯誤碼.html 放在模板引擎文件夾下的 error 文件夾下】,發(fā)生此狀態(tài)碼的錯誤就來到

對應(yīng)的頁面;

我們可以使用 4xx 和 5xx 作為錯誤頁面的文件名來匹配這種類型的所欲錯誤,精確優(yōu)先(優(yōu)先尋找精確的 狀態(tài)碼.html );

頁面能夠獲取到的信息

timestamp :時間戳

status : 狀態(tài)碼

exception : 異常對象

message : 異常消息

errors : JSR303數(shù)據(jù)校驗的錯誤都在這兒

2>.沒有模板引擎(模板引擎找不到這個頁面),靜態(tài)資源文件夾下找

3>.以上都沒有錯誤頁面,就默認(rèn)來到 springboot 默認(rèn)的錯誤頁面

②、自定義異常處理&返回定制json數(shù)據(jù);

@ControllerAdvicepublic class MyExceptionHandler { @ResponseBody @ExceptionHandler(UserNotExistException.class) public Map<String,Object> handleException(Exception e){ Map<String,Object> map = new HashMap<>(); map.put('code','user.notexist'); map.put('message',e.getMessage()); return map; }}//通過異常處理器,但沒有自適應(yīng)效果(瀏覽器返回頁面,客戶端訪問返回json數(shù)據(jù))

2)、轉(zhuǎn)發(fā)到/error進行自適應(yīng)響應(yīng)效果處理

@RequestMapping( produces = {'text/html'})public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { //獲取錯誤的狀態(tài)碼,在分析的過程中,要注意參數(shù)從哪兒來? =======》前領(lǐng)導(dǎo)的一句話,哈哈…… HttpStatus status = this.getStatus(request); Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML))); response.setStatus(status.value());//依據(jù)錯誤狀態(tài)碼解析錯誤試圖,如果直接轉(zhuǎn)發(fā),不指定錯誤狀態(tài)碼則試圖解析出錯(直接轉(zhuǎn)發(fā)狀態(tài)碼為 200 ,到不了定制的 4xx 5xx 的頁面) ModelAndView modelAndView = this.resolveErrorView(request, response, status, model); return modelAndView != null ? modelAndView : new ModelAndView('error', model);}

@ExceptionHandler(UserNotExistException.class) public String handleException(Exception e, HttpServletRequest request){ Map<String,Object> map = new HashMap<>(); <strong>//傳入我們自己的錯誤狀態(tài)碼 4xx 5xx,否則就不會進入定制錯誤頁面的解析流程</strong> /** * Integer statusCode = (Integer) request .getAttribute('javax.servlet.error.status_code'); */ request.setAttribute('javax.servlet.error.status_code',500); map.put('code','user.notexist'); map.put('message',e.getMessage()); //轉(zhuǎn)發(fā)到/error return 'forward:/error'; }

3)、將我們的定制數(shù)據(jù)攜帶出去;======》即修改model中的值即可

出現(xiàn)錯誤以后,會來到/error請求,會被BasicErrorController處理,響應(yīng)出去可以獲取的數(shù)據(jù)是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)規(guī)定的方法);

1、完全來編寫一個ErrorController的實現(xiàn)類【或者是編寫AbstractErrorController的子類】,放在容器中;

2、頁面上能用的數(shù)據(jù),或者是json返回能用的數(shù)據(jù)都是通過errorAttributes.getErrorAttributes得到;

容器中DefaultErrorAttributes.getErrorAttributes();默認(rèn)進行數(shù)據(jù)處理的;

自定義ErrorAttributes

//給容器中加入我們自己定義的ErrorAttributes@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes { @Override public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace); map.put('company','atguigu'); return map; }}

最終的效果:響應(yīng)是自適應(yīng)的,可以通過定制ErrorAttributes改變需要返回的內(nèi)容,

Springboot錯誤處理機制實現(xiàn)原理解析

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷精品视频| 日本欧美不卡| 免费看欧美美女黄的网站| 国内精品福利| 美女少妇全过程你懂的久久| 久久国产免费| 婷婷激情综合| 快she精品国产999| 日韩综合一区二区三区| 欧美一区二区三区久久| 久久精品999| 免费在线亚洲欧美| 国产一区二区三区日韩精品| 欧美日韩国产观看视频| 日韩成人a**站| 久久久久久黄| 另类av一区二区| 日本免费一区二区视频| 国产精品视频一区二区三区 | 欧美亚洲tv| 麻豆国产精品一区二区三区 | 美女免费视频一区| 日本不良网站在线观看| 91精品一区二区三区综合| 欧美日韩国产一区二区三区不卡| 五月天激情综合网| 中文字幕亚洲影视| 欧美国产专区| 韩国精品主播一区二区在线观看| 在线看片不卡| 久久国内精品自在自线400部| 国产精品成人**免费视频| 热三久草你在线| 亚洲一区二区成人| 四虎精品一区二区免费| 久久精品资源| 欧洲毛片在线视频免费观看| 亚洲精品伊人| 久久一区欧美| 国产精品av久久久久久麻豆网| 视频一区免费在线观看| 国产精品分类| 蜜臀久久99精品久久一区二区| 色综合视频一区二区三区日韩| 久久伊人国产| 一区二区亚洲精品| 国产精品magnet| 亚洲天堂黄色| 欧美专区一区| 久久精品不卡| 欧美三区不卡| 99免费精品| 人人爱人人干婷婷丁香亚洲| 麻豆理论在线观看| 蜜桃视频免费观看一区| 国产66精品| 亚洲天堂日韩在线| 91综合视频| 亚洲v天堂v手机在线| 色欧美自拍视频| 亚洲精品第一| 日韩精品网站| 国产精品毛片视频| 亚洲作爱视频| 都市激情国产精品| 日韩 欧美一区二区三区| 欧美日韩视频网站| 日韩精品91亚洲二区在线观看| 国产精品久久久久久久免费观看| 老司机久久99久久精品播放免费| 色综合五月天| 亚洲人成亚洲精品| 久久国产成人午夜av影院宅| 欧美成人精品午夜一区二区| 日韩一级欧洲| 国产精品国产三级国产在线观看| 亚洲日本三级| 欧美福利一区| 91亚洲成人| 国产精品nxnn| 日韩高清中文字幕一区| 亚洲一级影院| 97欧美在线视频| 日本中文字幕视频一区| 免费观看久久av| 中文在线а√在线8| 国产午夜一区| 亚洲理论在线| 亚洲欧洲一区| 成人羞羞在线观看网站| 久久精品亚洲| 欧美日韩午夜电影网| 美日韩精品视频| 国产中文一区| 国产精品久久久久av电视剧| 老牛国内精品亚洲成av人片| 国产欧美精品久久| 日韩av中文在线观看| 久久高清国产| 欧美午夜不卡| 欧美在线亚洲| 在线一区电影| 亚洲国产不卡| 精品一区在线| 免费av一区| 欧美日韩国产高清| 午夜影院欧美| 免费毛片在线不卡| 久久五月天小说| 精精国产xxxx视频在线野外| 激情视频网站在线播放色| 精品一区二区三区的国产在线观看| 国产欧美日韩一区二区三区四区 | 日韩欧美字幕| 鲁鲁在线中文| 成人精品久久| 成人在线免费观看网站| 精品午夜av| 久久69成人| 精品视频久久| 精品高清久久| 亚洲美女久久精品| 四虎4545www国产精品| 中文av在线全新| 视频二区不卡| re久久精品视频| 亚洲欧美高清| 天堂精品久久久久| 国产精品一级| 国内自拍视频一区二区三区| 国产一区二区三区四区二区| 高清不卡亚洲| jiujiure精品视频播放| 午夜视频精品| 亚洲一级大片| 欧美日本三区| 精品精品久久| 日韩欧美自拍| 在线精品小视频| 中文一区一区三区免费在线观 | 成人午夜精品| 欧美99久久| 视频一区中文字幕精品| 国产探花一区| 久久香蕉精品香蕉| 久久精品免费一区二区三区| 伊人影院久久| 少妇精品久久久一区二区三区| 日韩av中文字幕一区| 免费一区二区三区在线视频| 丰满少妇一区| 91精品蜜臀一区二区三区在线 | 日韩欧美四区| 精品中文在线| 日韩久久电影| 中文欧美日韩| 日本aⅴ亚洲精品中文乱码 | 亚洲大全视频| 日本亚洲三级在线| 麻豆精品99| 久久精品影视| 伊人国产精品| 国产成人免费| aa国产精品| 国产精品videossex久久发布| 私拍精品福利视频在线一区| 久久成人一区| 国产日韩一区二区三区在线播放| 国产成人精品一区二区三区视频| 蜜臀久久99精品久久一区二区| 一区二区国产在线| 精品视频91| 国产精品日本| 久久一区精品| 99视频精品| 久久精品天堂| 99综合视频| 精品国产中文字幕第一页| 好看不卡的中文字幕| 国产日韩免费| 婷婷成人综合| 97久久亚洲| 97精品国产一区二区三区| 日韩在线一区二区| 国产69精品久久| 综合一区av| 四虎884aa成人精品最新| 日本成人中文字幕| se01亚洲视频| 国产另类在线| 好吊日精品视频| 国产suv精品一区二区四区视频 | 国产精品xvideos88| 午夜国产精品视频| 国产福利资源一区| 99riav1国产精品视频| 国产一区二区三区成人欧美日韩在线观看| 亚洲激情精品| 福利精品一区| 青青国产精品|