摘要:本人也處于學習的階段,發表此文章也是希望能夠得到更多的技術交流和幫助,文中的不足還有勞大家指出全局異常處理兩種實用實現方案
## SSM全局異常處理——兩種實用實現方案 ## 先前做項目時自己不是很門清這塊,在網上查閱資料后發現資料也不是很全面,因此自己摸索出來后就想著趕緊給大家分享一下,盡管此技術點很基礎,但是希望能夠幫到大家。
為什么實現:
在我們的項目運行過程中,無法完全避免出現一些位置的運行時異常(比如NullPointerException?),而恰恰我們并沒有對該異常進行處理,那么就會將此異常拋向用戶。
當用戶瀏覽頁面時突然眼前蹦出一堆看不懂的“外星文”,可想而知用戶的體驗度是非常差的。
而如果簡單的配置一下異常處理的話可以在web.xml中進行配置異常后跳轉的頁面,例如404
404 /404err.jsp
? ? ? ? ? ? 這種方法現在已經low到爆哦,如果我們是json請求呢?因此我們需要自己實現一套完美的異常處理,保證我們系統是健壯的!
?
?
springmvc HandlerExceptionResolver異常處理器:
今天我們就在springmvc的這個接口上進行一番操作(異常處理器啥是?)
public class SpringExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
參數:
? ? ? request:當前請求
? ? ? response:當前響應對象
? ? ? ex: 當本次方法執行異常,這個參數就是當前異常對象
?
?
實現方式A——根據請求類型,選擇不同的異常處理方式(不要忽略代碼注釋哦)
我們項目中的請求在一種角度可上分頁面請求、json請求。因此根據請求類型,選擇不同的異常處理方式就可以理解為:如果是頁面請求異常了,我們就選擇頁面請求異常處理來返回錯誤信息。如果是json請求異常,那么就以json的形式返回。
?
開始前準備兩個異常類型,為我們手動拋異常能區分開請求類型
CustomException:使用場景是前臺發送json請求,那么我們在該請求的service層拋出CustomException,前臺就會收到異常信息。
/** * 如果拋出此異常,系統會以json格式向前臺返回異常信息 * 使用方式: throw new CustomException("這里填入異常信息,會發送到前臺"); */ public class CustomException extends Exception{ private static final long serialVersionUID = -1668707977736987938L; //異常信息 public String message; public CustomException (String message) { super(message); this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
?
/** * @ClassName: ReturnViewException * @Description: 此異常類型用來向前臺返回頁面 */ public class ReturnViewException extends Exception{ private static final long serialVersionUID = -1668707977736987938L; //異常信息 public String message; public ReturnViewException (String message) { super(message); this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
?
public class IntegrateException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //判斷是否為ajax請求,默認不是 boolean isAjaxRequest = false; //這段代碼能夠得知是否為ajax請求,也就是我們說的json請求 if(!StringUtils.isBlank(request.getHeader("x-requested-with")) && request.getHeader("x-requested-with").equals("XMLHttpRequest")){ isAjaxRequest = true; } //如果是ajax請求 if(isAjaxRequest) { CustomException customException = null; if(ex instanceof CustomException) { customException = (CustomException) ex; }else { //如果拋出的不是系統自定義的異常則重新構造一個未知錯誤異常 //這里我就也有CustomException省事了,實際中應該要再定義一個新的異常 customException = new CustomException ("系統未知錯誤,請聯系管理員"); } String message = customException.getMessage(); //向前臺返回錯誤信息 ModelAndView model = new ModelAndView(); FastJsonJsonView view = new FastJsonJsonView(); Mapmap = new HashMap (); map.put("code", 5000); map.put("message", message); view.setAttributesMap(map); model.setView(view); return model; }else { //如果不是ajax請求 那么異常后需要返回頁面 ReturnViewException returnViewException = null; //如果拋出的異常類型是我們預想的,會想前臺返回我們指定在參數里的頁面 if(ex instanceof ReturnViewException) { returnViewException = (ReturnViewException) ex; }else { //這里的500是我資源下的500.jsp,使用了mvc的映射省去了前綴后綴 //系統默認跳轉到500頁面 returnViewException = new ReturnViewException("500"); } ModelAndView model = new ModelAndView(); model.setViewName(returnViewException.getMessage()); return model; } } }
在此同時我們需要在springmvc.xml中配置我們的全局異常處理類,bean id別隨意更改..
現在就可以開始使用了~~~~
手動使用:
throw new CustemException("錯誤了"); //向前臺返回 "錯誤了" 異常信息 throw new ReturnViewException("500err") //前臺重定向到500err.jsp
當然出現未知異常后,回自動向前臺返回我們默認的異常信息
?
實現方式B——自定義項目接口規則,判斷特定的異常處理方式
實現的主要原理更簡單明亮:
方才A方案是判斷請求類型,這里我們更加暴力,假如我規定項目的json請求全部以 .json結尾,頁面請求全部以 .page結尾,那么我們就可以在異常處理器攔截到異常時,判斷請求的后綴來決定怎么處理了。不同點就在這里,但是雖然A復雜點,我還是推薦使用A
好,拋代碼,這是springmvc.xml
?
創建異常類(這個東西,根據需要判多少種異常類型,我們可以創很多的,不僅限于一兩個)
public class ParamException extends RuntimeException { public ParamException() { super(); } public ParamException(String message) { super(message); } public ParamException(String message, Throwable cause) { super(message, cause); } public ParamException(Throwable cause) { super(cause); } protected ParamException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } } public class PermissionException extends RuntimeException { public PermissionException() { super(); } public PermissionException(String message) { super(message); } public PermissionException(String message, Throwable cause) { super(message, cause); } public PermissionException(Throwable cause) { super(cause); } protected PermissionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
然后我們上最關鍵的異常處理器
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { String url = request.getRequestURL().toString(); ModelAndView mv; String defaultMsg = "System error"; // 這里我們要求項目中所有請求json數據,都使用.json結尾 if (url.endsWith(".json")) { if (ex instanceof PermissionException || ex instanceof ParamException) { JsonData result = JsonData.fail(ex.getMessage()); mv = new ModelAndView("jsonView", result.toMap()); } else { log.error("unknown json exception, url:" + url, ex); JsonData result = JsonData.fail(defaultMsg); mv = new ModelAndView("jsonView", result.toMap()); } } else if (url.endsWith(".page")){ // 這里我們要求項目中所有請求page頁面,都使用.page結尾 log.error("unknown page exception, url:" + url, ex); JsonData result = JsonData.fail(defaultMsg); mv = new ModelAndView("exception", result.toMap()); } else { log.error("unknow exception, url:" + url, ex); JsonData result = JsonData.fail(defaultMsg); mv = new ModelAndView("jsonView", result.toMap()); } return mv; }
結束語:
這就是我整理出來的兩種ssm全局異常處理方式了,希望能夠幫助到大家。本人也處于學習的階段,發表此文章也是希望能夠得到更多的技術交流和幫助,文中的不足還有勞大家指出!
SSM全局異常處理——兩種實用實現方案csdn:https://blog.csdn.net/qq_4182...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73513.html
摘要:首先,定義一個存放異常處理函數的類,并使用修飾。修飾的方法的寫法和內的異常處理函數寫法是一樣的。控制生效的范圍注意到,我是這樣編寫注解的它用來限定這些異常處理函數起作用的的范圍。使用的機制,做統一異常處理。 在具體的SSM項目開發中,由于Controller層為處于請求處理的最頂層,再往上就是框架代碼的。因此,肯定需要在Controller捕獲所有異常,并且做適當處理,返回給前端一個友...
摘要:有必要建一個資源服務器存放靜態資源。一些用戶級別的數據輕量可以考慮存儲在中。存儲的是值,可以通過來對和對象之間的轉換如果我們的數據是在后臺傳過去或者轉換而成的,在前臺上并沒有做什么改變的話。 移動商城項目總結 移動商城項目是我第二個做得比較大的項目,該項目系統來源于傳智Java168期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 通過這次的項目又再次開闊了我的視野,...
摘要:接著上一篇,我們在測試可以允許后,我們接著來寫一個查詢功能,一連接數據庫的查詢例子我來看看項目的結構頂級父項目公司默認有的父項目數據層 接著上一篇,我們在測試web可以允許后,我們接著來寫一個查詢功能, 一、 連接數據庫的查詢例子 我來看看項目的結構: tx-parent 頂級父項目(公司默認有的) |- tx-manager ------------------------...
閱讀 2753·2021-11-22 14:45
閱讀 896·2021-10-15 09:41
閱讀 1058·2021-09-27 13:35
閱讀 3662·2021-09-09 11:56
閱讀 2626·2019-08-30 13:03
閱讀 3191·2019-08-29 16:32
閱讀 3296·2019-08-26 13:49
閱讀 766·2019-08-26 10:35