SpringMVC中的異常處理機制詳解
1. 概述
SpringMVC提供了基于xml和基于注解的異常處理機制,一般情況下兩者都要進行配置,xml異常處理機制主要用于處理xml方式產(chǎn)生的異常,注解異常處理機制主要用于處理基于注解方式產(chǎn)生的異常。
2. 基于xml方式的異常處理機制
<!--配置基于xml的異常映射-->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--key屬性指定具體的出錯類型,標簽體中為對應的出錯頁面(這個值會拼上前后綴以得到全路徑)-->
<prop key="java.lang.Exception">system-error</prop>
</props>
</property>
</bean>3. 基于注解方式的異常處理
步驟:
- 使用@ControllerAdvice注解表名此類為異常處理類
- 方法上使用@ExceptionHandler注解表示此方法處理何種異常,如
@ExceptionHandler(value = ArithmeticException.class)
4. 實際應用
一般若是普通請求產(chǎn)生的異常,則應該返回錯誤頁面,若是Ajax請求返回的是相應的JSON字符串。
判斷一個請求是否是Ajax請求
請求依據(jù):(兩者含其一則為Ajax請求)
- 請求頭中Accept中包含application/json
- 請求頭中X-Requested-With字段為XMLHttpRequest的為Ajax請求
/**
* 判斷此次請求是否是Ajax請求
* @param request 此次請求對應的request對象
* @return true表示是Ajax請求,false表示是普通請求
*/
public static boolean isAjax(HttpServletRequest request) {
String accept = request.getHeader("Accept");
String xRequestHeader = request.getHeader("X-Requested-With");
return accept != null && accept.contains("application/json")
||
xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest");
}配置基于xml方式的異常處理機制
配置基于注解方式的異常處理
package com.wuw.crowd.mvc.config;
import com.google.gson.Gson;
import com.wuw.crowd.exception.LoginFailedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.wuw.crowd.util.CrowdUtil;
import com.wuw.crowd.constant.CrowdConstant;
import com.wuw.crowd.util.ResultEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @description: 基于注解的異常處理機制
* @author: WuW
* @create: 2022/5/2 18:36
*/
@ControllerAdvice
public class MyExceptionResolver {
@ExceptionHandler(value = ArithmeticException.class)
public ModelAndView resolveArithmeticException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
String viewName = "system-error";
return commonResolve(viewName, exception, request, response);
}
@ExceptionHandler(value = NullPointerException.class)
public ModelAndView resolveNullPointerException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
String viewName = "system-error";
return commonResolve(viewName, exception, request, response);
}
@ExceptionHandler(value = LoginFailedException.class)
public ModelAndView resolveLoginFailedException(HttpServletRequest request, HttpServletResponse response, LoginFailedException exception) throws IOException {
String viewName = "admin-login";
return commonResolve(viewName, exception, request, response);
}
/**
* 抽取異常處理機制的公共部分
* @param viewName 將要返回到哪個頁面
* @param exception 捕獲到的異常信息
* @param request 請求對象
* @param response 響應對象
* @return 返回ModelAndView
* @throws IOException 響應對象獲取輸出流時拋出異常
*/
private ModelAndView commonResolve(String viewName, Exception exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean ajax = CrowdUtil.isAjax(request);
// 如果是Ajax請求
if (ajax) {
// 創(chuàng)建ResultEntity對象
ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
Gson gson = new Gson();
// 將ResultEntity對象轉(zhuǎn)換為JSON字符串
String s = gson.toJson(failed);
// 將JSON字符串作為響應體返回給瀏覽器
response.getWriter().write(s);
return null;
}
// 如果是普通請求
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
// 設置對應的視圖名稱
modelAndView.setViewName(viewName);
return modelAndView;
}
}
注:ResultEntity對象為統(tǒng)一響應對象,其中的failed方法實際上是將傳入的exception對象封裝成一個ResultEntity對象并返回給調(diào)用者。CrowdConstant類為自定義的常量類,主要用于存儲各種常用的字符串,可有效預防寫錯單詞導致的程序錯誤,在實際開發(fā)中十分有用。
解釋:若為Ajax請求,則應該向瀏覽器返回一個JSON字符串格式的ResultEntity對象,此時異常處理機制返回null即可;若為普通請求,則拋出異常,并返回異常頁面(此時是頁面名稱,因為前后綴在mvc文件中已配置)。
到此這篇關于SpringMVC中的異常處理機制的文章就介紹到這了,更多相關SpringMVC異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot實現(xiàn)動態(tài)切換數(shù)據(jù)源的示例代碼
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)動態(tài)切換數(shù)據(jù)源的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-08-08
IDEA Maven Mybatis generator 自動生成代碼(實例講解)
下面小編就為大家分享一篇IDEA Maven Mybatis generator 自動生成代碼的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
Spring創(chuàng)建Bean的過程Debug的詳細流程
這篇文章主要介紹了Spring創(chuàng)建Bean的過程Debug的流程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
詳解SpringBoot如何優(yōu)雅的進行全局異常處理
在SpringBoot的開發(fā)中,為了提高程序運行的魯棒性,我們經(jīng)常需要對各種程序異常進行處理,但是如果在每個出異常的地方進行單獨處理的話,這會引入大量業(yè)務不相關的異常處理代碼,這篇文章帶大家了解一下如何優(yōu)雅的進行全局異常處理2023-07-07
springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解
這篇文章主要為大家介紹了springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
下面小編就為大家?guī)硪黄狫ava創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給大家?guī)韼椭?/div> 2021-06-06最新評論

