日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

詳解SpringBoot錯誤處理

來源: 責編: 時間:2024-03-27 09:26:03 204觀看
導(dǎo)讀環(huán)境:SpringBoot2.7.161. 簡介默認情況下,Spring Boot提供了一個/error映射,以合理的方式處理所有錯誤,并且它在servlet容器中注冊為“全局”錯誤頁面。對于機器客戶端,它會生成一個JSON響應(yīng),其中包含錯誤、HTTP狀態(tài)和異常

環(huán)境:SpringBoot2.7.16ada28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

默認情況下,Spring Boot提供了一個/error映射,以合理的方式處理所有錯誤,并且它在servlet容器中注冊為“全局”錯誤頁面。對于機器客戶端,它會生成一個JSON響應(yīng),其中包含錯誤、HTTP狀態(tài)和異常消息的詳細信息。對于瀏覽器客戶端,有一個“白標簽”錯誤視圖,它以HTML格式呈現(xiàn)相同的數(shù)據(jù)(要自定義它,只需要定義一個以error 為beanName的View bean對象)。ada28資訊網(wǎng)——每日最新資訊28at.com

如果需要自定義默認的錯誤處理行為,可以通過設(shè)置server.error相應(yīng)屬性。ada28資訊網(wǎng)——每日最新資訊28at.com

要完全替換默認行為,可以實現(xiàn)ErrorController并注冊為Bean,或者添加ErrorAttributes類型的bean。ada28資訊網(wǎng)——每日最新資訊28at.com

BasicErrorController可以用作自定義ErrorController的基類。如果想為新的內(nèi)容類型添加處理程序,這一點尤其有用(默認情況是專門處理text/html,并為其他所有內(nèi)容提供后備)。要做到這一點,請擴展BasicErrorController,添加一個帶有具有products屬性的@RequestMapping的公共方法,并創(chuàng)建一個新類型的bean。ada28資訊網(wǎng)——每日最新資訊28at.com

從Spring Framework 6.0開始,支持RFC 7807 Problem Details。Spring MVC可以使用application/pproblem+json媒體類型生成自定義錯誤消息,如:ada28資訊網(wǎng)——每日最新資訊28at.com

{  "type": "http://www.pack.com/users/666",  "title": "Unknown project",  "status": 404,  "detail": "xxxxx",  "instance": "/users/666"}

可以通過將spring.mvc.problemdetails.enabled設(shè)置為true來啟用此支持。ada28資訊網(wǎng)——每日最新資訊28at.com

還可以定義一個用@ControllerAdvice注釋的類,以自定義JSON格式輸出,如以下示例所示:ada28資訊網(wǎng)——每日最新資訊28at.com

@RestControllerAdvice(basePackageClasses = SomeController.class)public class MyControllerAdvice extends ResponseEntityExceptionHandler {  @ExceptionHandler(Exception.class)  public ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {    HttpStatus status = getStatus(request);    return new ResponseEntity<>(new MyErrorBody(status.value(), ex.getMessage()), status);  }  private HttpStatus getStatus(HttpServletRequest request) {    Integer code = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);    HttpStatus status = HttpStatus.resolve(code);    return (status != null) ? status : HttpStatus.INTERNAL_SERVER_ERROR;  }}

2. 自定義錯誤頁

如果要顯示給定狀態(tài)代碼的自定義HTML錯誤頁面,可以將文件添加到/error目錄中。錯誤頁面可以是靜態(tài)HTML(即添加到任何靜態(tài)資源目錄下),也可以使用模板構(gòu)建。文件的名稱應(yīng)該是確切的狀態(tài)代碼或序列掩碼。ada28資訊網(wǎng)——每日最新資訊28at.com

例如,要將404映射到靜態(tài)HTML文件,目錄結(jié)構(gòu)如下:ada28資訊網(wǎng)——每日最新資訊28at.com

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- public/             +- error/             |   +- 404.html             +- <other public assets>

要使用FreeMarker模板映射所有5xx錯誤,目錄結(jié)構(gòu)如下:ada28資訊網(wǎng)——每日最新資訊28at.com

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- templates/             +- error/             |   +- 5xx.ftlh             +- <other templates>

對于更復(fù)雜的映射,還可以添加實現(xiàn)ErrorViewResolver接口的bean,如以下示例所示:ada28資訊網(wǎng)——每日最新資訊28at.com

@Componentpublic class PackErrorViewResolver implements ErrorViewResolver {  @Override  public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {    if (status == HttpStatus.INTERNAL_SERVER_ERROR) {      return new ModelAndView("error") ;    }    return null ;  }}

3. 向容器注冊錯誤頁

對于不使用Spring MVC的應(yīng)用程序,可以使用ErrorPageRegistrar接口直接注冊ErrorPages。這種抽象直接與底層嵌入式Servlet容器一起工作,即使沒有Spring MVC DispatcherServlet也能工作。ada28資訊網(wǎng)——每日最新資訊28at.com

@Configurationpublic class PackErrorPagesConfiguration {  @Bean  public ErrorPageRegistrar errorPageRegistrar() {    return this::registerErrorPages;  }  private void registerErrorPages(ErrorPageRegistry registry) {    registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));  }}

4. 默認錯誤頁注冊原理

這里以Tomcat為例,SpringBoot內(nèi)嵌tomcat容器會自動注冊TomcatServletWebServerFactory該類進行Tomcat容器的配置,這其中就包括將錯誤頁注冊到tomcat中。并且該類實現(xiàn)了ErrorPageRegistry接口,該類專門用來注冊錯誤頁。ada28資訊網(wǎng)——每日最新資訊28at.com

public class TomcatServletWebServerFactory {  public WebServer getWebServer(...) {    Tomcat tomcat = new Tomcat();    // ...    prepareContext(...);  }  protected void prepareContext(...) {    // ...    configureContext(...)  }  protected void configureContext(...) {    // ...    // 獲取容器中定義的所有ErrorPage錯誤頁    for (ErrorPage errorPage : getErrorPages()) {      org.apache.tomcat.util.descriptor.web.ErrorPage tomcatErrorPage = new org.apache.tomcat.util.descriptor.web.ErrorPage();      tomcatErrorPage.setLocation(errorPage.getPath());      tomcatErrorPage.setErrorCode(errorPage.getStatusCode());      tomcatErrorPage.setExceptionType(errorPage.getExceptionName());      context.addErrorPage(tomcatErrorPage);    }  }}

這些ErrorPage通過如下方式被添加到上面的TomcatServletWebServerFactory中ada28資訊網(wǎng)——每日最新資訊28at.com

SpringBoot會注冊一個ErrorPageRegistrarBeanPostProcessor處理器ada28資訊網(wǎng)——每日最新資訊28at.com

public class ErrorPageRegistrarBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    // 上面說了TomcatServletWebServerFactory實現(xiàn)了ErrorPageRegistry接口    if (bean instanceof ErrorPageRegistry) {      postProcessBeforeInitialization((ErrorPageRegistry) bean);    }    return bean;  }  private void postProcessBeforeInitialization(ErrorPageRegistry registry) {    for (ErrorPageRegistrar registrar : getRegistrars()) {      registrar.registerErrorPages(registry);    }  }  private Collection<ErrorPageRegistrar> getRegistrars() {    if (this.registrars == null) {      // 獲取容器中的所有ErrorPageRegistrar      this.registrars = new ArrayList<>(          this.beanFactory.getBeansOfType(ErrorPageRegistrar.class, false, false).values());      this.registrars.sort(AnnotationAwareOrderComparator.INSTANCE);      this.registrars = Collections.unmodifiableList(this.registrars);    }    return this.registrars;  }}

注意:自定義ErrorPageRegistrar時,我們可以通過實現(xiàn)Ordered接口控制優(yōu)先級ada28資訊網(wǎng)——每日最新資訊28at.com

以上是本篇文章的全部內(nèi)容,希望對你有幫助。ada28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79606-0.html詳解SpringBoot錯誤處理

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: React為什么要廢棄ComponentWillMount、ReceiveProps和Update這三個生命周期

下一篇: Figma 在協(xié)同編輯中使用的順序一致性算法: Fractional indexing

標簽:
  • 熱門焦點
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過14.
  • 0糖0卡0脂 旭日森林仙草烏龍茶優(yōu)惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領(lǐng)取50元優(yōu)惠券,到手價為29.9元。產(chǎn)品規(guī)格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個小小的重要功能可以大大改善您網(wǎng)站的用戶體驗
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據(jù)官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據(jù)10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業(yè)領(lǐng)先的性能,令人印象深刻的電池續(xù)航,精美豐
  • AI藝術(shù)欣賞體驗會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現(xiàn)在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術(shù)欣賞體驗會”在上海
Top 主站蜘蛛池模板: 京山县| 阳山县| 吉隆县| 敖汉旗| 蒙山县| 五华县| 四子王旗| 淮南市| 合作市| 乌拉特中旗| 奉新县| 金沙县| 龙井市| 克拉玛依市| 合作市| 霍林郭勒市| 察隅县| 东丽区| 武乡县| 扎兰屯市| 新龙县| 荥经县| 曲麻莱县| 固阳县| 天气| 唐海县| 精河县| 合江县| 孟州市| 根河市| 聂荣县| 樟树市| 新闻| 连江县| 遵化市| 穆棱市| 布拖县| 普陀区| 原阳县| 临泽县| 萝北县|