欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot2.3定制錯誤頁面的方法示例

 更新時間:2020年08月12日 10:47:32   作者:Android_la  
這篇文章主要介紹了SpringBoot2.3定制錯誤頁面的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一. 問題背景

后臺: SpringBoot 2.3.1(官方2.3版本修改了很多,拋棄了很多以前能用的方法)
前端: Layui(前端用哪個框架問題不大)

技術(shù): SpringBoot+Thymeleaf+Layui

情況:我想將Layui提供好的錯誤頁面作為SpringBoot默認(rèn)的錯誤頁面,而且Layui提供的錯誤頁面位置并不是放在/靜態(tài)資源文件夾/error,而是在如下:

二. SpringBoot的錯誤頁面機(jī)制

錯誤頁面機(jī)制的原理詳情可以看Day41——錯誤處理原理&定制錯誤頁面以及Day42——定制錯誤數(shù)據(jù)。

首先要知道SpringBoot的錯誤頁面機(jī)制原理自動配置是由ErrorMvcAutoConfiguration配置的。所以定制錯誤頁面的解決方案都可以參考ErrorMvcAutoConfiguration類以及參考他人博客。

這里只做簡單的回顧,如下:

三. 定制錯誤頁面

首先我項(xiàng)目里面在application.properties配置了靜態(tài)資源路徑為classpath:/templates/layuimini/,如下:

#自定義靜態(tài)資源路徑
spring.resources.static-locations=classpath:/templates/layuimini/

大家根據(jù)需要自行調(diào)整自己項(xiàng)目里面的靜態(tài)資源路徑,后面的定制錯誤頁面的路徑會根據(jù)這個配置好的路徑去尋找,或者拼串。

3.1 方案一(最簡單的,但是不推薦)

3.1.1 步驟

最簡單是 在靜態(tài)資源文件夾下面創(chuàng)建一個error文件夾,在里面放置自己的錯誤頁面,如下:


不推薦的原因是,我當(dāng)前的目錄結(jié)構(gòu)是所有的頁面都是放在/templates/layuimini/page/文件夾下面的,如果按照上面做法,會破壞我的目錄結(jié)構(gòu),后期維護(hù)很困難。

3.1.2 原理

在BasicErrorController中,封裝視圖的時候,當(dāng)前項(xiàng)目如果有模板引擎,會先用模板引擎解析,找不到再去靜態(tài)資源文件夾尋找視圖(視圖名是error/狀態(tài)碼.html,這是指error文件夾下的狀態(tài)碼.html文件,這是由私有方法實(shí)現(xiàn)的,所以外部無法修改)。因此上面的步驟就是SpringBoot先去templates文件夾下找,找不到,再去/templates/layuimini/這個靜態(tài)資源文件夾找(前提是你設(shè)置了靜態(tài)資源文件夾;否則默認(rèn)按SpringBoot的默認(rèn)靜態(tài)資源文件夾找,比如resources、public、static、resource)

3.2 方案二(不能實(shí)現(xiàn)自適應(yīng)定制錯誤頁面,不推薦)

3.2.1 步驟

首先放置好自定義的錯誤頁面,是在/templates/layuimini/page/error/,如下:


然后再創(chuàng)建一個MyErrorPageConfig類,最最最關(guān)鍵的是new ErrorPage()中第二個入?yún)?,如果是加?code>.html,那么就會直接找頁面,如果沒有加,那么將它當(dāng)作請求去找controller,如下:

@Configuration
public class MyErrorPageConfig {

  @Bean
  public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
    return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
      @Override
      public void customize(ConfigurableWebServerFactory factory) {
        ErrorPage errorPage1 = new ErrorPage(HttpStatus.NOT_FOUND, "/page/error/4xx.html");
        ErrorPage errorPage2 = new ErrorPage(HttpStatus.NOT_FOUND, "/page/error/5xx.html");
        factory.addErrorPages(errorPage1, errorPage2);
      }
    };
  }
}

3.2.2 原理

詳情可以參考Day46——SpringBoot2.x版本的嵌入式Servlet容器自動配置原理以及Day47——嵌入式Servlet容器啟動原理

首先要知道SpringBoot2.x版本的嵌入式Servlet容器是由ServletWebServerFactoryAutoConfiguration類配置的。一切的配置信息以及解決方案都可以參考這個類。

這里只做簡單解釋,如下:


這樣它就會執(zhí)行上面步驟中的customize()方法中的方法

3.3 方案三(實(shí)現(xiàn)自適應(yīng))

自適應(yīng)就是根據(jù)發(fā)送的/error請求是瀏覽器還是客戶端,使用不同的controller方法進(jìn)行處理,并返回不同類型的數(shù)據(jù)

3.3.1 步驟

創(chuàng)建一個實(shí)現(xiàn)了ErrorController接口的MyBasicErrorController類,如下:

/**
 * 定制ErrorController,目的是能使SpringBoot找到自己定制的錯誤頁面
 * 大部分的代碼BasicController一致,關(guān)鍵點(diǎn)是修改錯誤頁面的路徑
 */
@Controller
@RequestMapping(value = "/error")
public class MyBasicErrorController implements ErrorController {


  @RequestMapping(produces = {"text/html"})//返回給瀏覽器
  public String handlerError(HttpServletRequest request, Model model){
    WebRequest webRequest = new ServletWebRequest(request);//對request進(jìn)行包裝,目的是能操作更多的方法
    HttpStatus status = this.getStatus(request);//獲取status

    String path = (String) webRequest.getAttribute("javax.servlet.error.request_uri", 0);
    String message = (String) webRequest.getAttribute("javax.servlet.error.message", 0);
    if(message.equals("")){
      message = "No Available Message";
    }

    //攜帶錯誤數(shù)據(jù)信息
    model.addAttribute("timestamp", new Date());
    model.addAttribute("statusCode", status.value());
    model.addAttribute("error", status.getReasonPhrase());
    model.addAttribute("message", message);
    model.addAttribute("path", path);

    int i = status.value() / 100;//判斷是4xx還是5xx錯誤
    if(i == 4){
      return "layuimini/page/error/4xx";//使用自己定制的錯誤頁面
    }else if(i == 5){
      return "layuimini/page/error/5xx";//使用自己定制的錯誤頁面
    }
    return null;
  }

  @RequestMapping//返回給客戶端
  public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    WebRequest webRequest = new ServletWebRequest(request);//對request進(jìn)行包裝,目的是能操作更多的方法
    HttpStatus status = this.getStatus(request);//獲取status
    Map<String, Object> map = new HashMap<>();

    if (status == HttpStatus.NO_CONTENT) {
      return new ResponseEntity(status);
    } else {

      String path = (String) webRequest.getAttribute("javax.servlet.error.request_uri", 0);
      String message = (String) webRequest.getAttribute("javax.servlet.error.message", 0);

      map.put("timestamp", new Date());
      map.put("statusCode", status.value());
      map.put("error", status.getReasonPhrase());
      map.put("message", message);
      map.put("path", path);

      return new ResponseEntity(map, status);
    }
  }



  protected HttpStatus getStatus(HttpServletRequest request) {
    Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
    if (statusCode == null) {
      return HttpStatus.INTERNAL_SERVER_ERROR;
    } else {
      try {
        return HttpStatus.valueOf(statusCode);
      } catch (Exception var4) {
        return HttpStatus.INTERNAL_SERVER_ERROR;
      }
    }
  }

  @Override
  public String getErrorPath() {
    return "null";
  }
}

3.3.2 原理

SpringBoot的錯誤頁面機(jī)制的自適應(yīng),是由BasicErrorController實(shí)現(xiàn)的,而這個BasicErrorController只有在容器中沒有ErrorController的情況下,才會被注冊進(jìn)容器,因此我們創(chuàng)建一個實(shí)現(xiàn)了ErrorController接口的類,這個BasicErrorController就失效,然后我們仿照BasicErrorController里面的方法來實(shí)現(xiàn)自己的controller就可以了。如下:

@Bean
  @ConditionalOnMissingBean(
    value = {ErrorController.class},//沒有ErrorController才會去注冊BasicErrorController
    search = SearchStrategy.CURRENT
  )
  public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, ObjectProvider<ErrorViewResolver> errorViewResolvers) {
    return new BasicErrorController(errorAttributes, this.serverProperties.getError(), (List)errorViewResolvers.orderedStream().collect(Collectors.toList()));
  }

上面實(shí)現(xiàn)步驟中的一些錯誤數(shù)據(jù)是參照DefaultErrorAttributes中的方法實(shí)現(xiàn)的

到此這篇關(guān)于SpringBoot2.3定制錯誤頁面的方法示例的文章就介紹到這了,更多相關(guān)SpringBoot2.3定制錯誤頁面內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot-注解-操作日志的實(shí)現(xiàn)方式

    Springboot-注解-操作日志的實(shí)現(xiàn)方式

    這篇文章主要介紹了Springboot-注解-操作日志的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Jmeter接口登錄獲取參數(shù)token報(bào)錯問題解決方案

    Jmeter接口登錄獲取參數(shù)token報(bào)錯問題解決方案

    這篇文章主要介紹了Jmeter接口登錄獲取參數(shù)token報(bào)錯問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • JDK?8和JDK?17的區(qū)別和新特性大全

    JDK?8和JDK?17的區(qū)別和新特性大全

    這篇文章主要給大家介紹了關(guān)于JDK?8和JDK?17的區(qū)別和新特性的相關(guān)資料,文中總結(jié)一些Jdk8到Jdk17的一些新特性,給大家選擇jdk版本的時候有些參考性,需要的朋友可以參考下
    2023-06-06
  • java 中HashMap實(shí)現(xiàn)原理深入理解

    java 中HashMap實(shí)現(xiàn)原理深入理解

    這篇文章主要介紹了java 中HashMap實(shí)現(xiàn)原理深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳解SpringBoot健康檢查的實(shí)現(xiàn)原理

    詳解SpringBoot健康檢查的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解SpringBoot健康檢查的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • mybatis-plus 使用Condition拼接Sql語句各方法的用法

    mybatis-plus 使用Condition拼接Sql語句各方法的用法

    這篇文章主要介紹了mybatis-plus 使用Condition拼接Sql語句各方法的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中的集合注入代碼實(shí)例

    Spring中的集合注入代碼實(shí)例

    這篇文章主要介紹了Spring中的集合注入代碼實(shí)例,集合注入是指在Spring框架中,通過配置文件或注解的方式將集合類型的數(shù)據(jù)注入到Bean中,集合類型包括List、Set、Map和Properties等,需要的朋友可以參考下
    2023-11-11
  • Java JDBC基本使用方法詳解

    Java JDBC基本使用方法詳解

    這篇文章主要介紹了Java JDBC基本使用方法,結(jié)合實(shí)例形式詳細(xì)分析了java JDBC基本原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Java編程synchronized與lock的區(qū)別【推薦】

    Java編程synchronized與lock的區(qū)別【推薦】

    互聯(lián)網(wǎng)信息泛濫環(huán)境下少有的良心之作!如果您想對Java編程synchronized與lock的區(qū)別有所了解,這篇文章絕對值得!分享給大家,供需要的朋友參考。不說了,我先學(xué)習(xí)去了。
    2017-10-10
  • Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解

    Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個疫情防控管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11

最新評論