SpringMVC全局異常處理小結(jié)
一、為什么要全局異常處理?
我們知道,系統(tǒng)中異常包括:編譯時(shí)異常和運(yùn)行時(shí)異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規(guī)范代碼開發(fā)、測試通過手段減少運(yùn)行時(shí)異常的發(fā)生。在開發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過程解耦出來,既保證了相關(guān)處理過程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。
二、異常處理思路(參考下圖)
三、SpringMVC異常分類
1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;
2)實(shí)現(xiàn)Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;
3)使用@ControllerAdvice + @ExceptionHandler
四、綜合案例
1、首先創(chuàng)建一個(gè)error頁面,為方便后面異常處理操作
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1> 系統(tǒng)錯(cuò)誤,請聯(lián)系管理員??! </h1> ${msg} </body> </html>
4.1 SpringMVC自帶的簡單異常處理器
SpringMVC中自帶了一個(gè)異常處理器叫SimpleMappingExceptionResolver,該處理器實(shí)現(xiàn)了HandlerExceptionResolver 接口,全局異常處理器都需要實(shí)現(xiàn)該接口
1)配置SpringMVC簡單異常處理器
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定義默認(rèn)的異常處理頁面 --> <property name="defaultErrorView" value="error"/> <!-- 定義異常處理頁面用來獲取異常信息的變量名,也可不定義,默認(rèn)名為exception --> <property name="exceptionAttribute" value="ex"/> <!-- 定義需要特殊處理的異常,這是重要點(diǎn) --> <property name="exceptionMappings"> <props> <!--異常類型 錯(cuò)誤視圖--> <prop key="java.lang.RuntimeException">error</prop> </props> <!-- 還可以定義其他的自定義異常 --> </property> </bean>
2)方法中拋出此異常
/** * 返回實(shí)體類的JSON數(shù)據(jù) * @param bookId * @return */ @RequestMapping("/querySingleBook") @ResponseBody public Book querySingleBook(Integer bookId){ Book book = bookService.selectByPrimaryKey(bookId); book.setCreatedate(new Date()); //此處只是為了進(jìn)行案例演示 if(bookId<100){ throw new RuntimeException("查詢的書本編號小于100,異常拋出?。?); } return book; }
3)頁面效果
4.2 通過HandlerExceptionResovler接口實(shí)現(xiàn)全局異常
注:
1)通過instanceof判斷異常類型
2)通過設(shè)置mv.setView(new MappingJackson2JsonView())方式返回JSON數(shù)據(jù);
1)通過HandlerExceptionResovler接口實(shí)現(xiàn)全局異常處理器
package com.zking.ssm.book.exception; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * SpingMVC提供的第二種全局異常處理方式 ,實(shí)現(xiàn)HandlerExceptionResolver接口 */ @Component public class GlobalException implements HandlerExceptionResolver { /** * * @param httpServletRequest * @param httpServletResponse * @param o 異常處理的目標(biāo) * @param e 異常處理的類型 * @return */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv=new ModelAndView(); mv.setViewName("error"); //判斷異常的分類 if(e instanceof RuntimeException){ RuntimeException ex=(RuntimeException)e; System.out.println(ex.getMessage()); mv.addObject("msg",ex.getMessage()); } return mv; } }
2)創(chuàng)建異常類
package com.zking.ssm.book.exception; public class BusinessException extends RuntimeException { public BusinessException() { } public BusinessException(String message) { super(message); } public BusinessException(String message, Throwable cause) { super(message, cause); } public BusinessException(Throwable cause) { super(cause); } }
@RequestMapping("/querySingleBook") @ResponseBody public Book querySingleBook(Integer bookId){ Book book = bookService.selectByPrimaryKey(bookId); if(bookId>100) throw new BusinessException("書本編號小于100,異常拋出?。?!"); book.setDate(new Date()); return book; }
3)頁面效果
4.3 使用@ControllerAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常
1)創(chuàng)建全局異常處理器
package com.zking.ssm.book.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import java.util.HashMap; import java.util.Map; /** * SpingMVC提供的第三種種全局異常處理方式 * 1)@ControllerAdvice +@ExceptionHandler * 2)@RestControllerAdvice +@ExceptionHandler * @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的數(shù)據(jù)格式,繞開視圖解析器 */ @ControllerAdvice public class GlobalException2{ @ExceptionHandler public ModelAndView exceptionHandler(Exception e){ ModelAndView mv=new ModelAndView(); //設(shè)置錯(cuò)誤頁面 mv.setViewName("error"); //判斷異常類型 if(e instanceof BusinessException){ BusinessException ex=(BusinessException)e; mv.addObject("msg","系統(tǒng)繁忙,請稍后再試......."); } mv.setView(new MappingJackson2JsonView()); return mv; } }
2)頁面效果
3)返回異常信息和狀態(tài)碼、返回JSON數(shù)據(jù)格式
package com.zking.ssm.book.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import java.util.HashMap; import java.util.Map; /** * SpingMVC提供的第三種種全局異常處理方式 * 1)@ControllerAdvice +@ExceptionHandler * 2)@RestControllerAdvice +@ExceptionHandler * @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的數(shù)據(jù)格式,繞開視圖解析器 */ @RestControllerAdvice public class GlobalException2{ @ExceptionHandler public Map<String, Object> exceptionHandler(Exception e){ Map<String, Object> json=new HashMap(); //判斷異常類型 if(e instanceof BusinessException){ json.put("msg","系統(tǒng)繁忙,請稍后再試......."); json.put("code",500); } return json; } }
4)頁面效果
希望可以給您帶來幫助,若有建議可以私信作者哦~
到此這篇關(guān)于SpringMVC之全局異常處理的文章就介紹到這了,更多相關(guān)SpringMVC全局異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)
很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06基于java實(shí)現(xiàn)簡單的銀行管理系統(tǒng)
這篇文章主要介紹了基于java實(shí)現(xiàn)簡單的銀行管理系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01springboot在idea下debug調(diào)試熱部署問題
這篇文章主要介紹了springboot在idea下debug調(diào)試熱部署問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換
有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了MyBatis動(dòng)態(tài)SQL標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07java使用XSSFWorkbook實(shí)現(xiàn)讀寫Excel
這篇文章主要為大家詳細(xì)介紹了java如何通過使用XSSFWorkbook實(shí)現(xiàn)讀寫Excel功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04java多線程并發(fā)executorservice(任務(wù)調(diào)度)類
這篇文章主要介紹了線程并發(fā)ScheduledExecutorService類,設(shè)置 ScheduledExecutorService ,2秒后,在 1 分鐘內(nèi)每 10 秒鐘蜂鳴一次2014-01-01