最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?MVC的三種異常處理方式實例詳解

 更新時間:2024年01月03日 09:06:10   作者:殘城碎夢  
在SpringMVC 中,不管是編譯異常還是運行時異常,都可以最終由 SpringMVC提供的異常處理器進行統(tǒng)一處理,這樣就避免了隨時隨地捕獲處理的繁瑣性,這篇文章主要介紹了Spring?MVC的三種異常處理方式?,需要的朋友可以參考下

Spring MVC異常的處理流程

異常分為編譯時異常和運行時異常,編譯時異常我們 try-catch進行捕獲,捕獲后自行處理,而運行時異常是不 可預期的,就需要規(guī)范編碼來避免,在SpringMVC 中,不管是編譯異常還是運行時異常,都可以最終由 SpringMVC提供的異常處理器進行統(tǒng)一處理,這樣就避免了隨時隨地捕獲處理的繁瑣性。

 SpringMVC 處理異常的思路是,一路向上拋,都拋給前端控制器 DispatcherServlet ,DispatcherServlet 在調(diào)用異常處理器ExceptionResolver進行處理,如下圖:

Spring MVC異常的處理方式

SpringMVC 提供了以下三種處理異常的方式:

  • 簡單異常處理器:使用SpringMVC 內(nèi)置的異常處理器處理SimpleMappingExceptionResolver;
  • 自定義異常處理器:實現(xiàn)HandlerExceptionResolver接口,自定義異常進行處理;
  • 注解方式:使用@ControllerAdvice + @ExceptionHandler 來處理

簡單異常處理器SimpleMappingExceptionResolver

配置開啟SimpleMappingExceptionResolver, 并指定異常捕獲后的處理動作,當發(fā)生了異常后,會被 SimpleMappingExceptionResolver 處理,跳轉(zhuǎn)到我們 配置的錯誤頁面error.html給用戶進行友好展示 。

<!--配置簡單異常處理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 異常捕獲后動作:展示視圖 -->
    <property name="defaultErrorView" value="/error.html"/>
</bean

可以在配置SimpleMappingExceptionResolver時,指定一些參數(shù),例如:異常的類型

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="defaultErrorView" value="/error.html"/>
    <property name="exceptionMappings">
        <props>
            <!-- 配置異常類型對應的展示視圖 -->
            <prop key="java.lang.RuntimeException">/error.html</prop>
            <prop key="java.io.FileNotFoundException">/io.html</prop>
        </props>
    </property>
</bean> 

注解方式配置簡單映射異常處理器 

@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
    //創(chuàng)建SimpleMappingExceptionResolver
    SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
    //設(shè)置默認錯誤展示視圖
    resolver.setDefaultErrorView("/error.html");
    //定義Properties設(shè)置特殊異常對應的映射視圖
    Properties properties = new Properties();
    properties.setProperty("java.lang.RuntimeException","/error.html");
    properties.setProperty("java.io.FileNotFoundException","/io.html");
    resolver.setExceptionMappings(properties);
    return resolver;
}

自定義異常處理器

實現(xiàn)HandlerExceptionResolver接口自定義異常處理器,可以完成異常邏輯的處理。

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    //參數(shù)Object是當前目標方法處理器對象HandlerMethod
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, 
                                         HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/error.html");
        return modelAndView;
    }
}

交給Spring管理異常處理器:

<bean class="com.fly.exception.MyHandlerExceptionResolver"></bean>

自定義異常處理器,返回Json格式字符串信息

@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, 
                                         HttpServletResponse httpServletResponse, Object o, Exception e) {
        //編寫要返回的json格式的字符串
        String jsonStr = "{\"code\":0,\"message\":\"error\",\"data\":\"\"}";
        try {
            httpServletResponse.getWriter().write(jsonStr);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return null;
    }
}

@ControllerAdvice + @ExceptionHandler 配置異常

@ControllerAdvice 注解本質(zhì)是一個 @Component,也會被掃描到,與此同時,具備AOP功能,默認情況下對所有的Controller都進行攔截操作, 攔截后干什么呢?就需要再結(jié)合@ExceptionHandler、@InitBinder、@ModelAttribute 注解一起使用了,此 處我們講解的是異常,所以是@ControllerAdvice + @ExceptionHandler的組合形式編寫全局異常處理器類,使用@ControllerAdvice標注,且@ExceptionHandler指定異常類型。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ModelAndView runtimeHandleException(RuntimeException e){
        System.out.println("全局異常處理器執(zhí)行...."+e);
        ModelAndView modelAndView = new ModelAndView("/error.html");
        return modelAndView;
    }
    @ExceptionHandler(IOException.class)
    @ResponseBody
    public ResultInfo ioHandleException(IOException e){
        //模擬一個ResultInfo
        ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
        return resultInfo;
    }
}

如果全局異常處理器響應的數(shù)據(jù)都是Json格式的字符串的話,可以使用@RestControllerAdvice替代 @ControllerAdvice 和 @ResponseBody

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ResultInfo runtimeHandleException(RuntimeException e){
        //模擬一個ResultInfo
        ResultInfo resultInfo = new ResultInfo(0,"RuntimeException",null);
        return resultInfo;
    }
    @ExceptionHandler(IOException.class)
    public ResultInfo ioHandleException(IOException e){
        //模擬一個ResultInfo
        ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
        return resultInfo;
    }
}

到此這篇關(guān)于Spring MVC的三種異常處理方式的文章就介紹到這了,更多相關(guān)Spring MVC異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring AOP結(jié)合注解實現(xiàn)接口層操作日志記錄

    Spring AOP結(jié)合注解實現(xiàn)接口層操作日志記錄

    在項目開發(fā)中我們需要記錄接口的操作日志:包含請求參數(shù)、響應參數(shù)、接口所屬模塊、接口功能描述、請求地址、ip地址等信息;實現(xiàn)思路很簡單就是基于注解和aop的方式去記錄日志,主要的難點在于日志表結(jié)構(gòu)、注解的設(shè)計已經(jīng)aop實現(xiàn)的一些比較好的實現(xiàn)方式的借鑒
    2022-08-08
  • SpringBoot的reload加載器的方法

    SpringBoot的reload加載器的方法

    本篇文章主要介紹了SpringBoot的reload加載器的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • java代碼之謎運算符篇

    java代碼之謎運算符篇

    從最簡單的運算符加號(+)說起,加號(+)是個二元運算符——也就是說,加號只把兩個數(shù)聯(lián)接起來,從來不把第三個或者更多的聯(lián)接起來
    2012-11-11
  • SpringBoot @Schedule的使用注意與原理分析

    SpringBoot @Schedule的使用注意與原理分析

    這篇文章主要介紹了SpringBoot @Schedule的使用注意與原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中有界隊列的飽和策略(reject policy)原理解析

    Java中有界隊列的飽和策略(reject policy)原理解析

    這篇文章主要介紹了Java中有界隊列的飽和策略(reject policy)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 最新評論

    金湖县| 长宁区| 保亭| 宾阳县| 杂多县| 中阳县| 白城市| 平原县| 桐柏县| 眉山市| 连州市| 文山县| 电白县| 巨鹿县| 沙雅县| 灵台县| 庄河市| 改则县| 双桥区| 仙居县| 五台县| 牟定县| 古田县| 福建省| 清原| 昭平县| 黑山县| 石阡县| 武义县| 措勤县| 甘孜| 木兰县| 刚察县| 华容县| 元朗区| 白山市| 双牌县| 清镇市| 温宿县| 大化| 牙克石市|