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

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

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

Spring MVC異常的處理流程

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

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

Spring MVC異常的處理方式

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

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

簡(jiǎn)單異常處理器SimpleMappingExceptionResolver

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

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

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

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

注解方式配置簡(jiǎn)單映射異常處理器 

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

自定義異常處理器

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

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    //參數(shù)Object是當(dāng)前目標(biāo)方法處理器對(duì)象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ì)是一個(gè) @Component,也會(huì)被掃描到,與此同時(shí),具備AOP功能,默認(rèn)情況下對(duì)所有的Controller都進(jìn)行攔截操作, 攔截后干什么呢?就需要再結(jié)合@ExceptionHandler、@InitBinder、@ModelAttribute 注解一起使用了,此 處我們講解的是異常,所以是@ControllerAdvice + @ExceptionHandler的組合形式編寫全局異常處理器類,使用@ControllerAdvice標(biāo)注,且@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){
        //模擬一個(gè)ResultInfo
        ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
        return resultInfo;
    }
}

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

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

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

相關(guān)文章

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

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

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

    SpringBoot的reload加載器的方法

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

    java代碼之謎運(yùn)算符篇

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

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

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

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

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

    洪雅县| 临沭县| 衡东县| 武平县| 疏附县| 武强县| 兰溪市| 保康县| 龙川县| 咸阳市| 葵青区| 焉耆| 霍城县| 闻喜县| 龙游县| 平谷区| 静海县| SHOW| 江门市| 益阳市| 桑植县| 古交市| 安乡县| 玛纳斯县| 邢台县| 阿合奇县| 岱山县| 比如县| 广宁县| 定远县| 吴桥县| 堆龙德庆县| 绵阳市| 许昌市| 灵宝市| 边坝县| 台东市| 六枝特区| 陆丰市| 察隅县| 郓城县|