最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義/error路徑失效的解決

 更新時(shí)間:2022年01月27日 14:20:56   作者:虎口脫險(xiǎn)OvO  
這篇文章主要介紹了SpringBoot自定義/error路徑失效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot自定義/error路徑失效

背景

最近使用SpringBoot做controller統(tǒng)一異常處理的時(shí)候,配置好映射路徑(/error),使用SpringBoot自帶的異常通知注解@ControllerAdvice配置好異常處理類,按理說在Controller發(fā)生異常的時(shí)候重定向到自定義錯(cuò)誤頁面(這里是重定向到SpringMVC的映射路徑),可實(shí)際調(diào)試的時(shí)候卻定向到了SpringBoot默認(rèn)的錯(cuò)誤頁面。

配置信息

此處配置只是一個(gè)小示例,省略了對異常的處理。

@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {    
    @ExceptionHandler({Exception.class})
    // 此方法參數(shù)有多個(gè),具體可參考相關(guān)文檔
    public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.sendRedirect(request.getContextPath() + "/error");
    }
}
@Controller
public class HomeController {
    @GetMapping("/error")
    public String getErrorPage(){
        // 此處使用了Thymeleaf模板,返回的是頁面
        return "/site/error/500";
    }
}

解決思路

由于我在controller中配置了/error的映射路徑,我通過網(wǎng)頁路徑直接訪問該路徑也是上面那個(gè)錯(cuò)誤頁面,斷點(diǎn)調(diào)試也沒有進(jìn)入我自定義的controller。

再看頁面顯示的狀態(tài)碼,不是404,說明該路徑是沒有問題的。

這個(gè)問題困惑了我很久,一開始沒轉(zhuǎn)過彎來。

說下我的解決思路,因?yàn)槲以谑褂玫腟pringBoot配置文件是application.yml,這個(gè)文件在idea中會(huì)有提示,我在該配置文件中輸入了error,如下圖:

這里有一個(gè)server.error.path=/error,看到這個(gè)就大概知道原因了,路徑?jīng)_突了,我在SpringMVC中配置的映射路徑也是error。

嘗試驗(yàn)證一下,將SpringMVC的路徑修改了一下,果然可以正常訪問了。

有沒有可以不改變SpringMVC路徑的方法呢?我一開始是在application.yml中加入下面這段配置:

server:
  error:
    # 此處可隨便寫一個(gè)路徑,或者留空也行,只有不和自定義的error路徑?jīng)_突
    path: 

這樣確實(shí)可以解決路徑?jīng)_突的問題,可是這只是去忽略它,而不是去修改它。

通過查閱資料發(fā)現(xiàn),SpringBoot會(huì)為我們創(chuàng)建一個(gè)叫BasicErrorController的類,該類由Spring創(chuàng)建并默認(rèn)用來處理Controller中的異常,如果能替換掉該類,就可以解決我們的問題。

如何替換?Spring提供的方法提供一個(gè)類型實(shí)現(xiàn)ErrorController接口,其實(shí)BasicErrorController也是實(shí)現(xiàn)了該類。

所有我們只需要將我們自定義ExceptionAdvice類實(shí)現(xiàn)該接口,實(shí)現(xiàn)相應(yīng)方法即可,修改后代碼如下:

@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice implements ErrorController{    
    private static final String ERROR_PATH = "/error";    
    @ExceptionHandler({Exception.class})
    // 此方法參數(shù)有多個(gè),具體可參考相關(guān)文檔
    public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.sendRedirect(request.getContextPath() + "/error");
    }
    
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }
}

小結(jié):其實(shí)就是一個(gè)很簡單的問題,而我在一開始的時(shí)候卻在糾結(jié)是不是注解使用錯(cuò)誤之類的事,debug方向是對的,就是一時(shí)間沒轉(zhuǎn)過彎來,導(dǎo)致這個(gè)問題困擾了我挺長的時(shí)間,好在及時(shí)理清思路后能解決該問題。

SpringBoot的/error的自定義處理

在springboot項(xiàng)目里,如果沒有統(tǒng)一異常處理,或者如果沒有處理全面,又或者在springCloud zuul中調(diào)用微服務(wù)接口出錯(cuò)時(shí),spring會(huì)自動(dòng)把錯(cuò)誤轉(zhuǎn)發(fā)到默認(rèn)給/error處理。

正常情況下,可以配置錯(cuò)誤頁面來給用戶提示錯(cuò)誤,如404,500等。但是在前后分離項(xiàng)目中,可能更期望給前臺(tái)返回一個(gè)特定格式的json來展示錯(cuò)誤信息。所以可以用代碼來自定義異常錯(cuò)誤信息。

/error端點(diǎn)的實(shí)現(xiàn)來源于SpringBoot的org.springframework.boot.autoconfigure.web.BasicErrorController,

它的具體定義如下

@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
? ? Map<String, Object> body = getErrorAttributes(request,isincludeStackTrace(request, MediaType.ALL)) ;
? ? HttpStatus status = getStatus(request);
? ? return new ResponseEntity<Map<String, Object>>(body, status);}

通過調(diào)用 getErrorAtt豆butes 方法來根據(jù)請求參數(shù)組織錯(cuò)誤信息的返回結(jié)果,而這里的 getErrorAtt豆bu七es 方法會(huì)將具體組織邏輯委托給 org.springframework.boot.autoconfigure.web.ErrorAttributes接口提供的 ge七ErrorAttributes 來實(shí)現(xiàn)。

在 Spring Boot 的自動(dòng)化配置機(jī)制中,默認(rèn)會(huì)采用 org.springframework.boot.autoconfigure.web.DefaultErrorAttribut作為該接口的實(shí)現(xiàn)。

在spring注冊這個(gè)bean的時(shí)候,使用了注解@ConditionalOnMissingBean(value = ErrorAttributes.class, search =SearchStrategy.CURRENT)

說明只有在不存在ErrorAttributes的bean的時(shí)候,才會(huì)使用DefaultErrorAttributes來處理,如果我們可以自定義一個(gè),就可以使用我們的類來處理異常了。

編寫一個(gè)類繼承DefaultErrorAttributes

他有三個(gè)方法

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex)
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace)
public Throwable getError(RequestAttributes requestAttributes)

他們的執(zhí)行順序就如上述順序。

我們可以在getErrorAttributes方法中拿到所有的異常信息,展示如下:

{"timestamp":1528190975129,"status":200,"error":"OK","exception":"java.lang.RuntimeException","message":"error............","path":"/a/b"}

可以在resolveException中拿到異常信息,如果需要返回json,則可以利用response來輸出到前臺(tái),比如:

    

/* 使用response返回 */
?? ??? ?response.setStatus(HttpStatus.OK.value()); // 設(shè)置狀態(tài)碼
?? ??? ?response.setContentType(MediaType.APPLICATION_JSON_VALUE); // 設(shè)置ContentType
?? ??? ?response.setCharacterEncoding("UTF-8"); // 避免亂碼
?? ??? ?response.setHeader("Cache-Control", "no-cache, must-revalidate");
?
?? ??? ?try {
?? ??? ??? ?response.getWriter().print("json..........");
?? ??? ??? ?response.getWriter().flush();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?} finally {
?? ??? ??? ?try {
?? ??? ??? ??? ?response.getWriter().close();
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}

這樣,當(dāng)有異常發(fā)生時(shí),就可以在前臺(tái)收到異常的json信息,而這個(gè)也可以代替統(tǒng)一異常處理使用。同時(shí)在springCloud zuul中可以用來自定義異常。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java利用異常中斷當(dāng)前任務(wù)的技巧分享

    Java利用異常中斷當(dāng)前任務(wù)的技巧分享

    在日常開發(fā)中,我們經(jīng)常遇到調(diào)用別人的代碼來完成某個(gè)任務(wù),但是當(dāng)代碼比較耗時(shí)的時(shí)候,沒法從外部終止該任務(wù),所以本文為大家介紹了如何利用異常中斷當(dāng)前任務(wù),需要的可以參考下
    2023-08-08
  • SpringBoot詳解自定義Stater的應(yīng)用

    SpringBoot詳解自定義Stater的應(yīng)用

    Springboot的出現(xiàn)極大的簡化了開發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,springboot官方同時(shí)也為開發(fā)人員封裝了各種各樣方便好用的starter模塊
    2022-07-07
  • Java中常用的數(shù)據(jù)庫連接池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中常用的數(shù)據(jù)庫連接池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏
    2017-08-08
  • 深入理解Java注解類型(@Annotation)

    深入理解Java注解類型(@Annotation)

    這篇文章主要介紹了深入理解Java注解類型(@Annotation),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • IDEA提示:Boolean method ‘xxx‘ is always inverted問題

    IDEA提示:Boolean method ‘xxx‘ is always&nb

    這篇文章主要介紹了IDEA提示:Boolean method ‘xxx‘ is always inverted問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署

    idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署

    本文主要介紹了idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Swagger2配置Security授權(quán)認(rèn)證全過程

    Swagger2配置Security授權(quán)認(rèn)證全過程

    這篇文章主要介紹了Swagger2配置Security授權(quán)認(rèn)證全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java spring的三種注入方式詳解流程

    Java spring的三種注入方式詳解流程

    Spring框架由Rod Johnson開發(fā),2004年發(fā)布了Spring框架的第一版。Spring是一個(gè)從實(shí)際開發(fā)中抽取出來的框架,因此它完成了大量開發(fā)中的通用步驟,留給開發(fā)者的僅僅是與特定應(yīng)用相關(guān)的部分,從而大大提高了企業(yè)應(yīng)用的開發(fā)效率
    2021-10-10
  • Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解

    Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解

    這篇文章主要介紹了Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java gbk轉(zhuǎn)utf-8

    Java gbk轉(zhuǎn)utf-8

    本文主要介紹了Java gbk轉(zhuǎn)utf-8的方法,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02

最新評論

云和县| 轮台县| 汾阳市| 西乡县| 万荣县| 驻马店市| 东海县| 富民县| 安平县| 银川市| 陕西省| 福泉市| 汶上县| 景谷| 桓仁| 隆化县| 张家港市| 洛扎县| 皋兰县| 内丘县| 克拉玛依市| 静海县| 墨竹工卡县| 胶州市| 阿鲁科尔沁旗| 容城县| 南华县| 满洲里市| 景洪市| 华池县| 黄梅县| 开平市| 鄂托克前旗| 绵竹市| 历史| 无极县| 苍南县| 襄城县| 沅江市| 吉木萨尔县| 大洼县|