在springMVC+mybatis+Ajax+JSON+jQuery easyui的項目中,自定義全局異常處理器




在springMVC+mybatis+Ajax+JSON+jQuery easyui的項目中,自定義全局異常處理器,來處理項目中的所有異常。

         在項目中,對於每一個功能即crud,在action中,都有2個方法,一個方法是返回到JSP頁面的方法,一個方法是返回JSON的方法(用了注解@responseBody)。

又因為異常是dao拋給service,service拋給action,所以只要針對action拋出的異常進行處理即可。

以下是原理:


       針對action異常的處理,主要是對上述的2個方法的處理,如果是返回到JSP頁面的異常就通過全局異常處理器類顯示一個錯誤的頁面。如果是返回JSON的異常,就通過全局異常處理器類把系統自定義類轉換為JSON,返回到JSP頁面,在JSP頁面通過jQuery easyui的message組件把異常信息友好的顯示出來。

a.返回JSON的效果圖

b.返回到錯誤頁面的效果圖


1.在該系統中,所有的異常信息,都封裝到了自定義的一個類ExceptionResultInfo中,該類繼承了Java的異常類Exception,如下:


package yycg.base.process.result;


/**
* 自定義系統異常類
* @author mrt
*
*/
public class ExceptionResultInfo extends Exception {

/**
* 系統提示信息
*/
private ResultInfo resultInfo;

public ExceptionResultInfo(ResultInfo resultInfo) {
super(resultInfo.getMessage());
this.resultInfo = resultInfo;
}

//get方法在轉json時使用
public ResultInfo getResultInfo() {
return resultInfo;
}

public void setResultInfo(ResultInfo resultInfo) {
this.resultInfo = resultInfo;
}

}


2.由於springMVC自帶了一個全局異常處理器類,注意全局異常處理器類在項目中只能有一個,所以為了使用我們自定義的異常處理器類,需要我們屏蔽springMVC的全局異常處理器類。如下,在web.xml中配置:

<!-- 定義springmvc的一級控制器DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!-- 以下是屏蔽springMVC的自定義全局異常處理器 -->
<init-param>
<param-name>detectAllHandlerExceptionResolvers</param-name>
<param-value>false</param-value>
</init-param>
</servlet>


3.在springMVC.xml配置文件中,還要配置以下信息:

這個類MappingJacksonHttpMessageConverter是spring自帶的,而這個類ExceptionResolverCustom就是我們自己要定義的全局異常處理器類。

<!-- Http messageConverters,用於將對象輸出到客戶端 -->
<bean id="jsonmessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>

<!-- 異常處理 -->
<bean id="handlerExceptionResolver"
class="yycg.base.process.exception.ExceptionResolverCustom">
<property name="jsonmessageConverter" ref="jsonmessageConverter" />

</bean>

4.ExceptionResolverCustom類如下:

主要就是注意判斷如果是返回到JSP頁面的異常就通過全局異常處理器類顯示一個錯誤的頁面。如果是返回JSON的異常,就通過全局異常處理器類把系統自定義類轉換為JSON,返回到JSP頁面,在JSP頁面通過jQuery easyui的message組件把異常信息友好的顯示出來。

package yycg.base.process.exception;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import yycg.base.process.context.Config;
import yycg.base.process.result.ExceptionResultInfo;
import yycg.base.process.result.ResultUtil;

public class ExceptionResolverCustom implements HandlerExceptionResolver {
//將錯誤信息解析成json返回客戶端
private HttpMessageConverter<ExceptionResultInfo> jsonmessageConverter;
/**
* 異常發生執行的方法,ex記錄了系統執行過程中的異常信息
*/
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//輸出異常信息
ex.printStackTrace();
//請求的action
HandlerMethod handlerMethod = (HandlerMethod)handler;
//獲取action執行的方法
Method method = handlerMethod.getMethod();

if (method == null) {
return null;
}
//使用AnnotationUtils工具類,找action方法上邊注解ResponseBody
ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method,
ResponseBody.class);
//如果action返回方法的類型是json
if (responseBodyAnn != null) {
try {
//返回類型為json方法的異常處理
return handleResponseBody(ex, request, response);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//這里表示action的方法返回的不是json
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName(Config.ERROR_PAGE);//走視圖解析器
ExceptionResultInfo resultInfo = null;
if(ex instanceof ExceptionResultInfo){
//resultInfo = ((ExcepResultInfo) ex).getResultInfo();
resultInfo = (ExceptionResultInfo) ex;
}else{
//判斷拋出的異常是否是系統特定的異常類,如果不是則需要構造成系統特定的異常類
//構造resultInfo
resultInfo = new ExceptionResultInfo(ResultUtil.createFail(Config.MESSAGE,900,null));
}
//將異常信息內容傳到頁面
modelAndView.addObject("exceptionResultInfo", resultInfo);


return modelAndView;
}

//自定義的處理action返回類型為json的異常處理方法
private ModelAndView handleResponseBody(Exception ex,
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//ResultInfo value = ((ExcepResultInfo) ex).getResultInfo();
//判斷拋出的異常是否是系統特定的異常類
if(!(ex instanceof ExceptionResultInfo)){
ex.printStackTrace();
//封裝成系統自定義的異常
ex = new ExceptionResultInfo(ResultUtil.createFail(Config.MESSAGE,900,null));
}
//轉化成系統自定義的異常
ExceptionResultInfo value = (ExceptionResultInfo) ex;
//創建http輸出對象
HttpOutputMessage outputMessage = new ServletServerHttpResponse(
response);
//將異常信息輸出成json
jsonmessageConverter.write(value, MediaType.APPLICATION_JSON,outputMessage);
return new ModelAndView();
}

public HttpMessageConverter<ExceptionResultInfo> getJsonmessageConverter() {
return jsonmessageConverter;
}

public void setJsonmessageConverter(HttpMessageConverter<ExceptionResultInfo> jsonmessageConverter) {
this.jsonmessageConverter = jsonmessageConverter;
}
}




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com