亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

SpringBoot自定義/error路徑失效

背景

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

配置信息

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

@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模板,返回的是頁(yè)面
        return "/site/error/500";
    }
}

解決思路

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

再看頁(yè)面顯示的狀態(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è)很簡(jiǎn)單的問題,而我在一開始的時(shí)候卻在糾結(jié)是不是注解使用錯(cuò)誤之類的事,debug方向是對(duì)的,就是一時(shí)間沒轉(zhuǎn)過彎來,導(dǎo)致這個(gè)問題困擾了我挺長(zhǎng)的時(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ò)誤頁(yè)面來給用戶提示錯(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ù)請(qǐng)求參數(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注冊(cè)這個(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)文章

  • Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    本篇文章主要介紹了Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 理解 MyBatis 是如何在 Spring 容器中初始化的

    理解 MyBatis 是如何在 Spring 容器中初始化的

    這篇文章主要介紹了理解 MyBatis 是如何在 Spring 容器中初始化的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Security中的WebSecurityConfigurerAdapter詳解

    Security中的WebSecurityConfigurerAdapter詳解

    這篇文章主要介紹了Security中的WebSecurityConfigurerAdapter詳解,今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置Spring?Security,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Spring手動(dòng)獲取bean的四種方式

    Spring手動(dòng)獲取bean的四種方式

    本文主要介紹了Spring手動(dòng)獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時(shí)獲取,啟動(dòng)類ApplicationContext獲取這四種方法,感興趣的可以了解一下
    2024-01-01
  • java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法

    java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法

    這篇文章主要介紹了java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Spring與Redis集成的正確方式流程詳解

    Spring與Redis集成的正確方式流程詳解

    這篇文章主要為大家介紹了Spring與Redis集成的正確方式流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Spring Task定時(shí)任務(wù)的配置和使用詳解

    Spring Task定時(shí)任務(wù)的配置和使用詳解

    本篇文章主要介紹了Spring Task定時(shí)任務(wù)的配置和使用詳解,實(shí)例分析了Spring Task定時(shí)任務(wù)的配置和使用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • idea手動(dòng)刷新git分支的詳細(xì)教程

    idea手動(dòng)刷新git分支的詳細(xì)教程

    這篇文章主要介紹了idea手動(dòng)刷新git分支,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java IO流 File類的常用API實(shí)例

    Java IO流 File類的常用API實(shí)例

    這篇文章主要介紹了Java IO流 File類的常用API實(shí)例的相關(guān)資料,需要的朋友參考下吧
    2017-05-05
  • maven的pom.xml中profiles的作用詳解

    maven的pom.xml中profiles的作用詳解

    這篇文章主要介紹了maven的pom.xml中profiles的作用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論