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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

詳解SpringBoot錯(cuò)誤處理

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

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

1. 簡(jiǎn)介

默認(rèn)情況下,Spring Boot提供了一個(gè)/error映射,以合理的方式處理所有錯(cuò)誤,并且它在servlet容器中注冊(cè)為“全局”錯(cuò)誤頁(yè)面。對(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ì)象)。rqj28資訊網(wǎng)——每日最新資訊28at.com

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

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

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。rqj28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

還可以定義一個(gè)用@ControllerAdvice注釋的類,以自定義JSON格式輸出,如以下示例所示:rqj28資訊網(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. 自定義錯(cuò)誤頁(yè)

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

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

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

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

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

對(duì)于更復(fù)雜的映射,還可以添加實(shí)現(xiàn)ErrorViewResolver接口的bean,如以下示例所示:rqj28資訊網(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. 向容器注冊(cè)錯(cuò)誤頁(yè)

對(duì)于不使用Spring MVC的應(yīng)用程序,可以使用ErrorPageRegistrar接口直接注冊(cè)ErrorPages。這種抽象直接與底層嵌入式Servlet容器一起工作,即使沒(méi)有Spring MVC DispatcherServlet也能工作。rqj28資訊網(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. 默認(rèn)錯(cuò)誤頁(yè)注冊(cè)原理

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

public class TomcatServletWebServerFactory {  public WebServer getWebServer(...) {    Tomcat tomcat = new Tomcat();    // ...    prepareContext(...);  }  protected void prepareContext(...) {    // ...    configureContext(...)  }  protected void configureContext(...) {    // ...    // 獲取容器中定義的所有ErrorPage錯(cuò)誤頁(yè)    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通過(guò)如下方式被添加到上面的TomcatServletWebServerFactory中rqj28資訊網(wǎng)——每日最新資訊28at.com

SpringBoot會(huì)注冊(cè)一個(gè)ErrorPageRegistrarBeanPostProcessor處理器rqj28資訊網(wǎng)——每日最新資訊28at.com

public class ErrorPageRegistrarBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    // 上面說(shuō)了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í),我們可以通過(guò)實(shí)現(xiàn)Ordered接口控制優(yōu)先級(jí)rqj28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 凌源市| 德昌县| 尤溪县| 泽库县| 米林县| 满城县| 新郑市| 锡林郭勒盟| 岑巩县| 泾川县| 晋中市| 寻甸| 平度市| 德清县| 秭归县| 方正县| 日照市| 蒲城县| 双辽市| 鄢陵县| 武强县| 宜君县| 塘沽区| 饶阳县| 绥滨县| 太和县| 新民市| 固阳县| 秀山| 延吉市| 兴仁县| 南宁市| 新安县| 阿巴嘎旗| 兰西县| 日土县| 溆浦县| 读书| 西畴县| 黄山市| 马龙县|