<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
預設情況下,SpringBoot會提供/error處理所有的錯誤請求並返回相應的資訊,對於瀏覽器使用者端來說會返回一個包含時間戳、狀態碼、錯誤資訊、攜帶的自定義異常資訊、發生錯誤的路徑等資訊的錯誤Whitelabel頁面,對於機器使用者端(postman等)會返回一個包含以上內容的JSON資料
要想替代之前瀏覽器使用者端返回的錯誤Whitelabel頁面,需要將自定義的html頁面放在靜態資源static等的error資料夾下或者模板引擎templates的error資料夾下,這樣的話出現錯誤時SpringBoot傳送/error請求就會自動解析這些頁面進行渲染。頁面解析規則:先將狀態碼的值與error資料夾下的頁面名進行精確匹配,如果精確匹配不到的話就按照4xx、5xx這樣的方式進行模糊匹配,要是還匹配不到的話就返回Whitelabel頁面
要是說錯誤頁面是按照狀態碼進行頁面處理的話,精確捕獲就是通過異常類進行捕獲,捕獲之後再進行一系列的自定義操作。具體步驟就是:建立一個例外處理器類,並在類上加@ControllerAdvice註解表明是一個例外處理器並向容器中註冊該元件,@ExceptionHandler註解對引數中的異常類進行精準捕獲,並在方法體定義具體的處理操作。
@Slf4j @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler({ArithmeticException.class, NullPointerException.class}) public String handleArithException(Exception e) { log.info("系統捕獲到異常資訊:{}", e); return "login"; } }
有時候我們需要在程式中自定義一些執行時異常,這些異常並不會像那些異常一樣產生異常狀態碼,甚至在未定義之前都不算是異常且不會影響程式的正常執行。這時就需要我們自定義異常的產生邏輯,並自定義異常類建立有參無參構造器,在類上加@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(); }
除了exception類中定義的異常外,spring框架底層也定義了一些異常,這些異常由DefaultHandlerExceptionResolver來處理
servlet元件需要自定義建立一個servlet類繼承HttpServlet,並使用@WebServlet註解的urlPatterns屬性宣告攔截的請求,再通過主程式類上使用@ServletComponentScan(basePackages = 「…」)註解將該元件掃描註冊到容器中。
// 宣告攔截的請求 @WebServlet(urlPatterns = "/my") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("385695"); } }
filter元件需要自定義建立一個filter類實現Filter介面,並使用@WebFilter註解的urlPatterns屬性宣告過濾的請求
@Slf4j @WebFilter(urlPatterns = {"/css/*", "/images/*"}) public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("MyFilter初始化……"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("MyFilter方法開始工作了……"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { log.info("MyFilter銷燬了……"); } }
listener元件需要自定義建立一個listener類實現ServletContextListener 介面,並使用@WebListener註解
@Slf4j @WebListener public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { log.info("MyServletContextListener監聽到專案初始化完成……"); } @Override public void contextDestroyed(ServletContextEvent sce) { log.info("MyServletContextListener監聽到專案已經銷燬……"); } }
除了使用註解進行註冊之外,還可以使用設定類的方式將以上三種元件註冊到容器中去
@Configuration public class MyRegistConfig { @Bean public ServletRegistrationBean MyServlet() { MyServlet myServlet = new MyServlet(); return new ServletRegistrationBean(myServlet, "/my", "/my02"); } @Bean public FilterRegistrationBean myFilter() { MyFilter myFilter = new MyFilter(); FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter); filterRegistrationBean.setUrlPatterns(Arrays.asList("/my", "/my02")); return filterRegistrationBean; } @Bean public ServletListenerRegistrationBean myListener() { MyServletContextListener listener = new MyServletContextListener(); return new ServletListenerRegistrationBean(listener); } }
通過servlet元件宣告的/my請求並不會經過spring的攔截器攔截處理,而是直接交由tomcat伺服器進行處理:現在有這麼兩個元件攔截到我們傳送的/my請求,一個是spring的元件DispatcherServlet通過/路徑攔截到,一個是tomcat的自定義MyServlet元件通過/my路徑攔截到。tomcat伺服器對請求有這麼一個處理規則,當多個servlet元件都能處理到同一個請求的時候,使用匹配度最高的元件進行處理,也就是說處理請求的是tomcat的MyServlet元件。
到此這篇關於SpringBoot2零基礎到精通之例外處理與web原生元件注入的文章就介紹到這了,更多相關SpringBoot2 例外處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45