【SpringBoot 2】(九)異常處理 web原生組件的注入

寫在前面在這里插入圖片描述🛫更多知識總結見SpringBoot 2專欄
🚕本篇知識點總結自尚硅谷雷神的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀

文章目錄

  • 1 異常處理
    • 1.1 異常處理之錯誤頁面
    • 1.2 異常處理之精確捕獲
    • 1.3 異常處理之自定義異常
    • 1.3 異常處理之框架底層異常
  • 2 web原生組件的注入
    • 2.1 servlet組件
    • 2.2 filter組件
    • 2.3 listener組件
  • 3 web實現定制化總結

1 異常處理

??默認情況下,SpringBoot會提供/error處理所有的錯誤請求并返回相應的信息,對于瀏覽器客戶端來說會返回一個包含時間戳、狀態碼、錯誤信息、攜帶的自定義異常信息、發生錯誤的路徑等信息的錯誤Whitelabel頁面,對于機器客戶端(postman等)會返回一個包含以上內容的JSON數據

1.1 異常處理之錯誤頁面

??要想替代之前瀏覽器客戶端返回的錯誤Whitelabel頁面,需要將自定義的html頁面放在靜態資源static等的error文件夾下或者模板引擎templateserror文件夾下,這樣的話出現錯誤時SpringBoot發送/error請求就會自動解析這些頁面進行渲染。頁面解析規則:先將狀態碼的值與error文件夾下的頁面名進行精確匹配,如果精確匹配不到的話就按照4xx、5xx這樣的方式進行模糊匹配,要是還匹配不到的話就返回Whitelabel頁面在這里插	·入圖片描述

1.2 異常處理之精確捕獲

??要是說錯誤頁面是按照狀態碼進行頁面處理的話,精確捕獲就是通過異常類進行捕獲,捕獲之后再進行一系列的自定義操作。具體步驟就是:創建一個異常處理器類,并在類上加@ControllerAdvice注解表明是一個異常處理器并向容器中注冊該組件,@ExceptionHandler注解對參數中的異常類進行精準捕獲,并在方法體定義具體的處理操作。

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler({ArithmeticException.class, NullPointerException.class})public String handleArithException(Exception e) {log.info("系統捕獲到異常信息:{}", e);return "login";}
}

1.3 異常處理之自定義異常

??有時候我們需要在程序中自定義一些運行時異常,這些異常并不會像那些異常一樣產生異常狀態碼,甚至在未定義之前都不算是異常且不會影響程序的正常運行。這時就需要我們自定義異常的產生邏輯,并自定義異常類創建有參無參構造器,在類上加@ResponseStatus注解,使用注解參數定義異常響應碼和異常信息

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用戶數量太多")
public class UserTooManyException extends RuntimeException{public UserTooManyException() {}public UserTooManyException(String message) {super(message);}
}

異常產生邏輯:

// 判斷用戶數量拋出用戶數量過多的自定義異常
if (users.size() > 3) {throw new UserTooManyException();
}

1.3 異常處理之框架底層異常

??除了exception類中定義的異常外,spring框架底層也定義了一些異常,這些異常由DefaultHandlerExceptionResolver來處理

2 web原生組件的注入

2.1 servlet組件

??servlet組件需要自定義創建一個servlet類繼承HttpServlet,并使用@WebServlet注解的urlPatterns屬性聲明攔截的請求,再通過主程序類上使用@ServletComponentScan(basePackages = “…”)注解將該組件掃描注冊到容器中。

// 聲明攔截的請求
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("385695");}
}

2.2 filter組件

??filter組件需要自定義創建一個filter類實現Filter接口,并使用@WebFilter注解的urlPatterns屬性聲明過濾的請求

@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("MyFilter初始化……");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("MyFilter方法開始工作了……");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("MyFilter銷毀了……");}
}

2.3 listener組件

??listener組件需要自定義創建一個listener類實現ServletContextListener 接口,并使用@WebListener注解

@Slf4j
@WebListener
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {log.info("MyServletContextListener監聽到項目初始化完成……");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {log.info("MyServletContextListener監聽到項目已經銷毀……");}
}

除了使用注解進行注冊之外,還可以使用配置類的方式將以上三種組件注冊到容器中去

@Configuration
public class MyRegistConfig {@Beanpublic ServletRegistrationBean MyServlet() {MyServlet myServlet = new MyServlet();return new ServletRegistrationBean(myServlet, "/my", "/my02");}@Beanpublic FilterRegistrationBean myFilter() {MyFilter myFilter = new MyFilter();FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/my", "/my02"));return filterRegistrationBean;}@Beanpublic ServletListenerRegistrationBean myListener() {MyServletContextListener listener = new MyServletContextListener();return new ServletListenerRegistrationBean(listener);}
}

??通過servlet組件聲明的/my請求并不會經過spring的攔截器攔截處理,而是直接交由tomcat服務器進行處理:現在有這么兩個組件攔截到我們發送的/my請求,一個是spring的組件DispatcherServlet通過/路徑攔截到,一個是tomcat的自定義MyServlet組件通過/my路徑攔截到。tomcat服務器對請求有這么一個處理規則,當多個servlet組件都能處理到同一個請求的時候,使用匹配度最高的組件進行處理,也就是說處理請求的是tomcatMyServlet組件。

3 web實現定制化總結

  • 創建配置類實現WebMvcConfigurer接口,重寫相應的方法或者使用@Bean注解向容器中擴展功能(使用的最多)
  • 自定義配置類使用@Bean注解使用自定義的web原生組件替換容器中的默認組件或者向容器中添加組件
  • 配置文件的配置項修改
  • xxxCustomizer
  • @EnableWebMvc注解表示全面接管SpringMVC,導致的效果就是SpringBoot的所有自動配置全部失效,全部功能都需要自己進行配置。大佬專屬注解,小白的禁術!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目管理最佳實踐方法_項目管理最佳實踐,企業如何進行有效的項目管理

前言:企業在劃分項目時,可按照項目的復雜程度、管理范圍等將項目分為三個級別,分別是企業級、部門級和小組級(與目標劃分原則相同),然后將每一級的目標與項目對應起來。我們知道,企業制定的目標…

python 歷遍子彈_python之子彈移動

"""新增功能:完成我方坦克發射子彈的移動"""import pygameimport timeimport randomwin_width 700win_height 500bg_color pygame.Color(0, 0, 0)text_color pygame.Color(255, 0, 0)class MainGame():window Nonemy_tank None…

【SpringBoot 2】(十)數據庫相關

寫在前面🛫更多知識總結見SpringBoot 2專欄 🚕本篇知識點總結自尚硅谷雷神的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…

線性分組碼的最小漢明距為6_第二章 線性代數

2.1 標量、向量、矩陣和張量標量(scalar)一個標量就是一個單獨的數,用斜體表示標量。向量(vector)一個向量是一列有序排列的數,用粗寫的小寫字母表示。矩陣(matrix)矩陣式一個二維數組,其中的么一個元素由兩個索引(而非一個)所確定&#xff0…

【SpringBoot 2】(十一)單元測試JUnit 5 指標監控

寫在前面🛫更多知識總結見SpringBoot 2專欄 🚕本篇知識點總結自尚硅谷雷神的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…

sklearn中lstm_分別用sklearn和tensorflow做房價預測

原標題:分別用sklearn和tensorflow做房價預測本篇是后面用tensorflow做回歸時的一個參照,忍不住要說的是sklearn真是簡單好用,要不是他沒有卷積cnn等時髦模型,真是不想用其他家的了。經典的sklearn集成模型結果:真是又…

多個containers 共用一個pvc_2020阜新PVC-UH市政管廠家-煙臺塑膠

2020阜新PVC-UH市政管廠家煙臺金沃泉塑膠有限公司主要產品PVC-U、PVC-M、PVC-UH聚氯乙烯給給水管材、HDPE高密度聚乙烯給水管材、CPVC氯化聚氯乙烯、MPP高壓電力電纜護套管、PERT-Ⅱ型熱力管道、高分子托輥管、水處理膜殼管。公司為電網、南方電網、電建集團、建筑集團、五礦集…

【SpringBoot 2】(十二) profile功能 自定義starter

寫在前面🛫更多知識總結見SpringBoot 2專欄 🚕本篇知識點總結自尚硅谷雷神的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…

jpa transaction 回滾_我遇到的JPA中事務回滾的問題

在最近的項目中,做的是解析XML文件,解析過程中會有異常,比如:XML文件中節點的數據和與之對應的數據庫的字段中數據的類型不匹配;XML中數據長度超過數據庫定義的長度;有數據了的重復插入問題;讀取…

pb 怎么判斷是 小數_考試90分以上的孩子是怎么學數學的?聽聽老師怎么說?

一二年級,考試上九十分很輕松。但是,不少小朋友一上三年級,成績就落下來了。那么,我們來看看三年級起,考試還能夠保持在90分以上的孩子是怎么學習數學的吧!第一,計算能力過關通過這兩張圖片的對…

快速上手Mybatis-Plus 入門案例

寫在前面🛫更多知識總結見Mybatis-Plus專欄 🚕內容總結自尚硅谷楊博超老師的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…

交換機分布緩存_網絡交換機緩存在數據中心的作用

什么產生了緩存?網絡交換機要配置多少緩存才夠用?緩存容量是否有標準可以衡量? 當網絡交換機接口收到超出其所能處理的流量后,它會選擇要么將其緩存,或者將其丟棄。 緩存通常都是因為網絡接口速率不同造成的&#xff0…

黑蘋果 選擇語言 點不了_什么是天然的“黑鉆”?—科普貼

天然黑鉆也被成為“碳酸氫”,具有與白鉆相同的化學成分,然而黑鉆石的晶體結構是不同的,這意味著它們由許多小晶體組成,它們以隨機的形式粘在一起,而不是一個具有可識別自然線的固體錐形。天然黑鉆石有極高的含物&#…

sim卡沒壞但蘋果手機無服務_解決手機插SIM卡后都顯示“無SIM卡”的故障問題

故障現象顧客描述手機插SIM卡后都顯示“無SIM卡”。維修過程引起插入SIM卡卻顯示“無SIM卡”的故障,除了可能是SIM卡座的供電、時鐘、復位及SIM卡插入檢測信號不正常導致外,還有可能是基帶不正常導致的。插上手機卡,左上角提示“無SIM卡”&am…

Mybatis-Plus實現簡單的增刪改查 實體類上的注解

寫在前面🛫更多知識總結見Mybatis-Plus專欄 🚕內容總結自尚硅谷楊博超老師的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…

webpack 讀取文件夾下的文件_webpack基本介紹及使用

1.什么是webpackwebpack是一個前端資源加載/打包工具。它根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成對應的靜態資源。從上圖看出,webpack可以將多種靜態資源js,css,less轉換成一個靜態文件,減少…

conda失敗說沒有寫權限_愛情中,為什么男生表白失敗,女生還說可以繼續做朋友,想過沒有...

在愛情中,不是每個男生都是幸運的,也不是每次的表白都是如你所愿的。有成功總有失敗,成功是喜悅的,但是失敗卻是痛苦的。不過有的時候男生和女生表白以后,女生對男生說了這樣的一段,其實我希望以后我們還是…

Mybatis-Plus中Wrapper條件構造器的使用

寫在前面 🛫更多知識總結見Mybatis-Plus專欄 🚕內容總結自尚硅谷楊博超老師的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀&#x1f680…

springboot設置默認值_線上Bug無法復現?老司機教你一招,SpringBoot遠程調試不用愁!...

前言在部署線上項目時,相信大家都會遇到一個問題,線上的 Bug 但是在本地不會復現,多么無奈。此時最常用的就是取到前端傳遞的數據用接口測試工具測試,比如 POSTMAN,復雜不,難受不?今天陳某教你一…

Mybatis-Plus的分頁 樂觀鎖插件 通用枚舉 多數據源

寫在前面🛫更多知識總結見Mybatis-Plus專欄 🚕內容總結自尚硅谷楊博超老師的視頻 🚒博主對于該知識尚在學習階段 🚄如果發現存在問題請毫不吝嗇的指出 🚀🚀扎哇太棗糕的博客首頁🚀🚀…