SpringMVC學(xué)習(xí)之JSON和全局異常處理詳解
1.為什么要全局異常處理
我們知道,系統(tǒng)中異常包括:編譯時(shí)異常和運(yùn)行時(shí)異常RuntimeException,前者通過(guò)捕獲異常從而獲取異常信息,后者主要通過(guò)規(guī)范代碼開(kāi)發(fā)、測(cè)試通過(guò)手段減少運(yùn)行時(shí)異常的發(fā)生。在開(kāi)發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過(guò)程解耦出來(lái),既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。
2.異常處理思路
系統(tǒng)的dao、service、controller出現(xiàn)異常都通過(guò)throws Exception向上拋出,最后由springmvc前端控制器交由異常處理器進(jìn)行異常處理。springmvc提供全局異常處理器(一個(gè)系統(tǒng)只有一個(gè)異常處理器)進(jìn)行統(tǒng)一異常處理。
3.SpringMVC異常分類
1)使用Spring MVC提供的簡(jiǎn)單異常處理器SimpleMappingExceptionResolver;
2)實(shí)現(xiàn)Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;
3)使用@ControllerAdvice + @ExceptionHandler
4.綜合案例
4.1 SpringMVC自帶的簡(jiǎn)單異常處理器
SpringMVC中自帶了一個(gè)異常處理器叫SimpleMappingExceptionResolver,該處理器實(shí)現(xiàn)了HandlerExceptionResolver 接口,全局異常處理器都需要實(shí)現(xiàn)該接口
<!-- springmvc提供的簡(jiǎn)單異常處理器 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定義默認(rèn)的異常處理頁(yè)面 --> <property name="defaultErrorView" value="error"/> <!-- 定義異常處理頁(yè)面用來(lái)獲取異常信息的變量名,也可不定義,默認(rèn)名為exception --> <property name="exceptionAttribute" value="ex"/> <!-- 定義需要特殊處理的異常,這是重要點(diǎn) --> <property name="exceptionMappings"> <props> <prop key="java.lang.RuntimeException">error</prop> </props> <!-- 還可以定義其他的自定義異常 --> </property> </bean>
注:頁(yè)面跳轉(zhuǎn)由SpringMVC來(lái)接管了,所以此處的定義默認(rèn)的異常處理頁(yè)面都應(yīng)該配置成邏輯視圖名。
4.2 通過(guò)HandlerExceptionResovler接口實(shí)現(xiàn)全局異常
@Component public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ... } }
注:
1)通過(guò)instanceof判斷異常類型
2)通過(guò)設(shè)置mv.setView(new MappingJackson2JsonView())方式返回JSON數(shù)據(jù);
4.3 使用@ControllerAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常
@ControllerAdvice public class GlobalExceptionResolver { @ExceptionHandler(value=RuntimeException.class) public ModelAndView handler(Exception e){ ... } }
4.4 響應(yīng)封裝類
4.4.1 創(chuàng)建自定義異常類BusinessException
BusinessException自定義異常類將繼承RuntimeException異常,該異常類用于處理在程序代碼運(yùn)行過(guò)程所產(chǎn)生的運(yùn)行時(shí)業(yè)務(wù)異常信息。
4.4.2 創(chuàng)建響應(yīng)枚舉類JsonResponseStatus
JsonResponseStatus響應(yīng)枚舉類用于自定義錯(cuò)誤碼
4.4.3 創(chuàng)建響應(yīng)封裝類JsonResponseBody
JsonResponseBody響應(yīng)封裝類用于以JSON的形式統(tǒng)一輸出錯(cuò)誤信息。
1. 添加jackson相關(guān)依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.3</version> </dependency>
2. 在springmvc-servlet.xml的mvc:annotation-driven標(biāo)簽下添加如下內(nèi)容
<!--但是,從spring3.1開(kāi)始DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter的使用已經(jīng)過(guò)時(shí)--> <!--spring3.1開(kāi)始我們應(yīng)該用RequestMappingHandlerMapping來(lái)替換DefaultAnnotationHandlerMapping,--> <!--spring3.1開(kāi)始我們應(yīng)該用用RequestMappingHandlerAdapter來(lái)替換AnnotationMethodHandlerAdapter--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter"/> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <!--處理中文亂碼以及避免IE執(zhí)行AJAX時(shí),返回JSON出現(xiàn)下載文件--> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean>
3. 在請(qǐng)求處理方法中添加@ResponseBody注解,將返回結(jié)果直接轉(zhuǎn)換成JSON
@RequestMapping("/loadFwxxToJson") @ResponseBody public Fwxx loadFwxxToJson(@ModelAttribute Fwxx fwxx) { ... }
注:此請(qǐng)求處理方法返回的已經(jīng)不是視圖了
4. 解決JSON死循環(huán)問(wèn)題:@JsonIgnore
5. 解決JSON格式化問(wèn)題
JsonFormat
日期格式化
數(shù)字格式化(使用較少)
6. 轉(zhuǎn)換時(shí)指定屬性名:@JsonProperty("error_code")
總結(jié)
到此這篇關(guān)于SpringMVC學(xué)習(xí)之JSON和全局異常處理的文章就介紹到這了,更多相關(guān)SpringMVC JSON和全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java打亂ArrayList生成一個(gè)隨機(jī)序列列表
有時(shí)候會(huì)需要將一個(gè)ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機(jī)出題、答案選項(xiàng)打亂、連線題打亂、抽獎(jiǎng)號(hào)碼打亂等等,把我自己寫(xiě)的一段代碼貼出來(lái)分享給大家。2016-08-08idea中Stash與Unstash的使用及說(shuō)明
這篇文章主要介紹了idea中Stash與Unstash的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Java中的常用時(shí)間日期類總結(jié)(Date、DateFormat)
在Java開(kāi)發(fā)中處理時(shí)間和日期是相當(dāng)常見(jiàn)的任務(wù),無(wú)論是計(jì)算日期差異、格式化日期顯示、解析日期字符串還是進(jìn)行日期計(jì)算,都需要一些時(shí)間和日期處理的技巧,這篇文章主要給大家介紹了關(guān)于Java中常用時(shí)間日期類(Date、DateFormat)的相關(guān)資料,需要的朋友可以參考下2024-08-08spring如何快速穩(wěn)定解決循環(huán)依賴問(wèn)題
這篇文章主要介紹了spring如何快速穩(wěn)定解決循環(huán)依賴問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java-lambda表達(dá)式入門(mén)看這一篇就夠了
lambda表達(dá)式最簡(jiǎn)單的作用就是用于簡(jiǎn)化創(chuàng)建匿名內(nèi)部類對(duì)象,Lambda表達(dá)式是一個(gè)可傳遞的代碼塊,可以在以后執(zhí)行一次或多次,下面通過(guò)本文給大家介紹Java-lambda表達(dá)式入門(mén)教程,感興趣的朋友一起看看吧2021-05-05Spring?Security中自定義cors配置及原理解析
在Spring框架中,通過(guò)自定義CORS配置可根據(jù)實(shí)際情況調(diào)整URL的協(xié)議、主機(jī)、端口等,以適應(yīng)"同源安全策略",配置原理涉及CorsConfigurer和CorsFilter,自定義配置需要注意@Configuration注解、方法名以及可能的@Autowired注解2024-10-10springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼
本文主要介紹了springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Java多線程中wait、notify、notifyAll使用詳解
這篇文章主要介紹了Java多線程中wait、notify、notifyAll使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05Guava?Retryer實(shí)現(xiàn)接口重試的示例
本文主要介紹了Guava?Retryer實(shí)現(xiàn)接口重試的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析
這篇文章主要介紹了Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07