SpringMVC全局異常處理小結(jié)
一、為什么要全局異常處理?
我們知道,系統(tǒng)中異常包括:編譯時異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規(guī)范代碼開發(fā)、測試通過手段減少運行時異常的發(fā)生。在開發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過程解耦出來,既保證了相關(guān)處理過程的功能較單一,也實現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。
二、異常處理思路(參考下圖)

三、SpringMVC異常分類
1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;
2)實現(xiàn)Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;
3)使用@ControllerAdvice + @ExceptionHandler
四、綜合案例
1、首先創(chuàng)建一個error頁面,為方便后面異常處理操作
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>
系統(tǒng)錯誤,請聯(lián)系管理員?。?
</h1>
${msg}
</body>
</html>4.1 SpringMVC自帶的簡單異常處理器
SpringMVC中自帶了一個異常處理器叫SimpleMappingExceptionResolver,該處理器實現(xiàn)了HandlerExceptionResolver 接口,全局異常處理器都需要實現(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"/>
<!-- 定義需要特殊處理的異常,這是重要點 -->
<property name="exceptionMappings">
<props> <!--異常類型 錯誤視圖-->
<prop key="java.lang.RuntimeException">error</prop>
</props>
<!-- 還可以定義其他的自定義異常 -->
</property>
</bean> 2)方法中拋出此異常
/**
* 返回實體類的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接口實現(xiàn)全局異常
注:
1)通過instanceof判斷異常類型
2)通過設(shè)置mv.setView(new MappingJackson2JsonView())方式返回JSON數(shù)據(jù);
1)通過HandlerExceptionResovler接口實現(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提供的第二種全局異常處理方式 ,實現(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實現(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è)置錯誤頁面
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)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06
springboot在idea下debug調(diào)試熱部署問題
這篇文章主要介紹了springboot在idea下debug調(diào)試熱部署問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
MyBatis動態(tài)SQL標(biāo)簽用法實例詳解
本文通過實例代碼給大家介紹了MyBatis動態(tài)SQL標(biāo)簽用法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-07-07
java使用XSSFWorkbook實現(xiàn)讀寫Excel
這篇文章主要為大家詳細(xì)介紹了java如何通過使用XSSFWorkbook實現(xiàn)讀寫Excel功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
java多線程并發(fā)executorservice(任務(wù)調(diào)度)類
這篇文章主要介紹了線程并發(fā)ScheduledExecutorService類,設(shè)置 ScheduledExecutorService ,2秒后,在 1 分鐘內(nèi)每 10 秒鐘蜂鳴一次2014-01-01

