成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解SpringBoot錯(cuò)誤處理

開發(fā) 前端
如果要顯示給定狀態(tài)代碼的自定義HTML錯(cuò)誤頁面,可以將文件添加到/error目錄中。錯(cuò)誤頁面可以是靜態(tài)HTML(即添加到任何靜態(tài)資源目錄下),也可以使用模板構(gòu)建。文件的名稱應(yīng)該是確切的狀態(tài)代碼或序列掩碼。

環(huán)境:SpringBoot2.7.16

1. 簡(jiǎn)介

默認(rèn)情況下,Spring Boot提供了一個(gè)/error映射,以合理的方式處理所有錯(cuò)誤,并且它在servlet容器中注冊(cè)為“全局”錯(cuò)誤頁面。對(duì)于機(jī)器客戶端,它會(huì)生成一個(gè)JSON響應(yīng),其中包含錯(cuò)誤、HTTP狀態(tài)和異常消息的詳細(xì)信息。對(duì)于瀏覽器客戶端,有一個(gè)“白標(biāo)簽”錯(cuò)誤視圖,它以HTML格式呈現(xiàn)相同的數(shù)據(jù)(要自定義它,只需要定義一個(gè)以error 為beanName的View bean對(duì)象)。

如果需要自定義默認(rèn)的錯(cuò)誤處理行為,可以通過設(shè)置server.error相應(yīng)屬性。

要完全替換默認(rèn)行為,可以實(shí)現(xiàn)ErrorController并注冊(cè)為Bean,或者添加ErrorAttributes類型的bean。

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

從Spring Framework 6.0開始,支持RFC 7807 Problem Details。Spring MVC可以使用application/pproblem+json媒體類型生成自定義錯(cuò)誤消息,如:

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

可以通過將spring.mvc.problemdetails.enabled設(shè)置為true來啟用此支持。

還可以定義一個(gè)用@ControllerAdvice注釋的類,以自定義JSON格式輸出,如以下示例所示:

@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. 自定義錯(cuò)誤頁

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

例如,要將404映射到靜態(tài)HTML文件,目錄結(jié)構(gòu)如下:

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

要使用FreeMarker模板映射所有5xx錯(cuò)誤,目錄結(jié)構(gòu)如下:

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

對(duì)于更復(fù)雜的映射,還可以添加實(shí)現(xiàn)ErrorViewResolver接口的bean,如以下示例所示:

@Component
public 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. 向容器注冊(cè)錯(cuò)誤頁

對(duì)于不使用Spring MVC的應(yīng)用程序,可以使用ErrorPageRegistrar接口直接注冊(cè)ErrorPages。這種抽象直接與底層嵌入式Servlet容器一起工作,即使沒有Spring MVC DispatcherServlet也能工作。

@Configuration
public class PackErrorPagesConfiguration {


  @Bean
  public ErrorPageRegistrar errorPageRegistrar() {
    return this::registerErrorPages;
  }


  private void registerErrorPages(ErrorPageRegistry registry) {
    registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
  }
}

4. 默認(rèn)錯(cuò)誤頁注冊(cè)原理

這里以Tomcat為例,SpringBoot內(nèi)嵌tomcat容器會(huì)自動(dòng)注冊(cè)TomcatServletWebServerFactory該類進(jìn)行Tomcat容器的配置,這其中就包括將錯(cuò)誤頁注冊(cè)到tomcat中。并且該類實(shí)現(xiàn)了ErrorPageRegistry接口,該類專門用來注冊(cè)錯(cuò)誤頁。

public class TomcatServletWebServerFactory {
  public WebServer getWebServer(...) {
    Tomcat tomcat = new Tomcat();
    // ...
    prepareContext(...);
  }
  protected void prepareContext(...) {
    // ...
    configureContext(...)
  }
  protected void configureContext(...) {
    // ...
    // 獲取容器中定義的所有ErrorPage錯(cuò)誤頁
    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中

SpringBoot會(huì)注冊(cè)一個(gè)ErrorPageRegistrarBeanPostProcessor處理器

public class ErrorPageRegistrarBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    // 上面說了TomcatServletWebServerFactory實(shí)現(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時(shí),我們可以通過實(shí)現(xiàn)Ordered接口控制優(yōu)先級(jí)

以上是本篇文章的全部?jī)?nèi)容,希望對(duì)你有幫助。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2011-05-25 10:26:42

ora-02069錯(cuò)誤

2021-04-14 07:08:14

Nodejs錯(cuò)誤處理

2021-03-02 09:12:25

Java異常機(jī)制

2014-11-17 10:05:12

Go語言

2022-11-16 08:41:43

2009-08-05 16:04:50

2010-06-01 16:14:04

2021-04-29 09:02:44

語言Go 處理

2023-10-28 16:30:19

Golang開發(fā)

2016-08-19 10:41:42

Swift 2錯(cuò)誤

2017-03-08 08:57:04

JavaScript錯(cuò)誤堆棧

2023-12-26 22:05:53

并發(fā)代碼goroutines

2017-04-06 14:40:29

JavaScript錯(cuò)誤處理堆棧追蹤

2015-08-19 14:11:56

SQL Server錯(cuò)誤處理

2009-06-19 16:20:14

ASP.NET錯(cuò)誤處理

2023-11-08 15:04:55

事務(wù)GORM

2023-10-08 20:31:18

React

2009-07-31 11:28:42

錯(cuò)誤處理機(jī)制ASP.NET

2025-01-16 16:36:00

2025-03-18 09:20:00

Go語言Golang
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久草高清视频 | 亚洲欧美自拍偷拍视频 | 91色啪| 亚洲精品成人在线 | 国产人免费人成免费视频 | 日韩精品一二三区 | 中文字字幕在线中文乱码范文 | 欧美另类视频在线 | 久草欧美| 久久久国产精品视频 | 一级毛片观看 | 亚洲视频一区 | 免费一区 | 91精品国产91久久久久游泳池 | 久久久久国产精品一区三寸 | 国产精品成人一区 | 高清一区二区视频 | 国产欧美日韩精品在线观看 | 亚洲a视频 | 伊人久久综合影院 | zzzwww在线看片免费 | 2021狠狠天天天 | 香蕉久久久 | 欧美综合在线视频 | 欧美日韩精品区 | 九九热在线视频免费观看 | 免费一二区 | av香蕉 | 色毛片| 91成人在线 | www亚洲精品 | 国产欧美在线观看 | 国产视频久 | 日本久久网 | 伊人久久大香线 | 成人欧美一区二区三区黑人孕妇 | 成人自拍视频网站 | 九九热这里只有精品在线观看 | 欧美精品1区2区3区 精品国产欧美一区二区 | 国产高清一二三区 | 精品国产一区二区三区久久久久久 |