中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot2異常處理與web原生組件注入的方法

發布時間:2022-03-22 13:35:12 來源:億速云 閱讀:93 作者:iii 欄目:開發技術

這篇文章主要介紹“SpringBoot2異常處理與web原生組件注入的方法”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot2異常處理與web原生組件注入的方法”文章能幫助大家解決問題。

    1 異常處理

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

    1.1 異常處理之錯誤頁面

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

    SpringBoot2異常處理與web原生組件注入的方法

    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.4 異常處理之框架底層異常

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

    2 web原生組件的注入

    2.1 servlet組件

    ??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");
        }
    }

    2.2 filter組件

    ??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銷毀了……");
        }
    }

    2.3 listener組件

    ??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原生組件注入的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    黄骅市| 清河县| 三河市| 龙川县| 元江| 英超| 沙湾县| 赫章县| 镇江市| 江都市| 长治市| 八宿县| 永修县| 壶关县| 新宁县| 彩票| 铜陵市| 龙井市| 西贡区| 繁昌县| 志丹县| 江源县| 长沙县| 叙永县| 盐边县| 融水| 西城区| 开封市| 章丘市| 临沂市| 日照市| 鄂尔多斯市| 垣曲县| 盈江县| 宁南县| 博罗县| 邵阳市| 拜泉县| 康乐县| 辉县市| 同心县|