SpringBoot專案實戰(7):自定義異常處理介面
在一般專案中都會有400、500和404這種的異常頁面,針對每個異常頁面都會設計相應的頁面佈局和樣式,也只有這樣的錯誤頁面才會讓普通使用者看著容易接受,而不是程式出錯後將異常程式碼暴露在頁面上,這種的使用者體驗...額,這種壓根就沒有使用者體驗這一說!
比如:
和:
相對來說第二種對使用者來說就顯得沒那麼"害怕"了。(原諒我用害怕這個詞)
其實在Springboot中,SB是預設把異常的處理都集中到了一個ModelAndView中
上圖是Springboot專案啟動時各個路徑的對映情況, 可以看到,預設是有兩個error對映的,其中一個是針對json一個是針對html頁面的。其中這些對映都是在BasicErrorController這個類下,如下圖:
它是統一跳轉到error這個頁面了。
再來看下我們本地的controller
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@RequestMapping("/")
public String home(Model model) {
return "index";
}
@RequestMapping("/error500")
public void index() {
int a = 1 / 0;
System.out.println(a);
}
@RequestMapping("/error400/{id}")
public Object error400(@PathVariable("id") Integer id) {
System.out.println(id);
return id;
}
}
如上圖,在訪問error500的時候一定會報500,在訪問error400/a時一定會報400,
新增error頁面(在error頁面中已經指定了"這是預設的error頁面"),
那麼在系統異常時就會跳到這個error頁面:
切入正題,SpringBoot中有ConfigurableEmbeddedServletContainer介面(它繼承自ErrorPageRegistry),
ErrorPageRegistry
上面兩幅圖是這個介面下的部分方法,可以看到,透過這個介面可以對SpringBoot程式進行很大程度的自定義控制,比如程式埠、session有效期等等。今天用到的就是上面最後一張圖中的addErrorPages方法。
@Component
public class AppErrorPagesConfiguration {
/**
* 自定義異常處理路徑
* @return
*/
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400"));
configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(java.lang.Throwable.class, "/error/500"));
}
};
}
}
然後定義一個Controller去重寫BasicErrorController的方法
/**
* 特別注意:這個類中的程式碼一定不能有問題,否則,你的程式可能會陷入死迴圈
*/
@Controller
@RequestMapping("/error")
@EnableConfigurationProperties({ServerProperties.class})
public class ErrorPageController implements ErrorController {
// 這兒只貼上具體實現程式碼,關於專案原始碼會在最後附上git地址,需要的同學自行下載
/**
* 定義404的返回頁面
*
* @param request
* @param response
* @return
*/
@RequestMapping(produces = "text/html", value = "404")
public ModelAndView errorHtml404(HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(getStatus(request).value());
Map model = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
return new ModelAndView("error/404", model);
}
/**
* 定義400的返回頁面
*
* @param request
* @param response
* @return
*/
@RequestMapping(produces = "text/html", value = "400")
public ModelAndView errorHtml400(HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(getStatus(request).value());
Map model = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
return new ModelAndView("error/400", model);
}
/**
* 定義500的返回頁面
*
* @param request
* @param response
* @return
*/
@RequestMapping(produces = "text/html", value = "500")
public ModelAndView errorHtml500(HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(getStatus(request).value());
Map model = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
return new ModelAndView("error/500", model);
}
// 這兒只貼上具體實現程式碼,關於專案原始碼會在最後附上git地址,需要的同學自行下載
}
然後新建三個頁面,同時頁面中分別標註一下具體的異常型別,如下圖
此時看下專案結構
OK,測試訪問效果
這就實現了異常頁面的分離,以便於定製各個異常頁面資訊。
我可以對一個人無限的好,前提是值得。 ——慕冬雪
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2798490/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- SpringBoot系列——自定義統一異常處理Spring Boot
- restframework 異常處理及自定義異常RESTFramework
- 【Django】DRF自定義異常處理Django
- C#自定義異常 統一異常處理C#
- springboot專案中的異常處理Spring Boot
- SpringBoot 實戰 (十四) | 統一處理異常Spring Boot
- springboot自定義異常Spring Boot
- Spring Cloud Gateway-自定義異常處理SpringCloudGateway
- 用列舉來處理java自定義異常Java
- 精講RestTemplate第7篇-自定義請求失敗異常處理REST
- Spring Cloud Gateway自定義異常處理Exception HandlerSpringCloudGatewayException
- Dubbo 自定義異常,你是怎麼處理的?
- 聊聊springboot專案全域性異常處理那些事兒Spring Boot
- SpringBoot錯誤處理機制以及自定義異常響應原理解析Spring Boot
- SpringBoot實現統一異常處理Spring Boot
- SpringBoot中異常處理Spring Boot
- Java異常處理的兩種方式以及自定義異常的使用方法Java
- J2EE專案異常處理
- SpringBoot-表單驗證-統一異常處理-自定義驗證資訊源Spring Boot
- 自定義異常
- activiti7---自定義流程圖(springboot專案)流程圖Spring Boot
- MySQL定義異常和異常處理詳解MySql
- Spring Boot 中關於自定義異常處理的套路!Spring Boot
- springboot全域性異常處理Spring Boot
- SpringBoot統一異常處理Spring Boot
- Java 異常(二) 自定義異常Java
- 異常-自定義異常的實現和測試
- JN專案-型別轉換異常處理型別
- java專案部署異常解析及處理方案Java
- 專案實戰介面開發SpringBootSpring Boot
- 自定義異常類
- Java自定義異常Java
- 自定義異常三
- SpringBoot之全域性異常處理Spring Boot
- 異常篇——異常處理
- 專案分享九:客戶端的異常處理客戶端
- 異常處理最佳實踐