ajax和普通请求使用spring mvc在controller中的异常统一处理
2016-12-21 16:33
579 查看
(1)建共用的异常处理器 CustomExceptionResolver
packagecom.ggs.mstd.controller;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.ibatis.ognl.OgnlException;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.servlet.ModelAndView;
importcom.ggs.mstd.CustomException.CustomException;
importcom.ggs.mstd.CustomException.RequestUtil;
importcom.ggs.mstd.CustomException.ResponseData;
[align=left]@Controller[/align]
publicclassCustomExceptionResolver
{
[align=left]
[/align]
[align=left]
[/align]
[align=left] /**@authorwenfei.fang@hand-china.com[/align]
[align=left] * 处理控制层所有异常.[/align]
*@paramexception
未捕获的异常
*@paramrequest
HttpServletRequest
*@returnResponseData(BaseException
被处理) 或者 ModelAndView(其他 Exception ,500错误)
[align=left] */[/align]
@ExceptionHandler(value
= { Exception.class})
public@ResponseBody
Object exceptionHandler(Exceptionexception, HttpServletRequestrequest,
HttpServletResponseresponse) {
[align=left] /*判断请求类型是不是ajax的*/[/align]
if(RequestUtil.isAjaxRequest(request))
{
/*如果是Ajax请求将错误信息返回到ajax
date*/
Throwablethr=
getRootCause(exception);
[align=left] ResponseDatares=newResponseData();[/align]
if(thrinstanceofCustomException)
{
[align=left] /*如果自定义的错误显示自定义的错误类型*/[/align]
CustomExceptionbe=
(CustomException)thr;
[align=left] res.findMessage(be.getCode());[/align]
[align=left] res.setCode(be.getCode());[/align]
[align=left] res.setMessage(be.getMessage());[/align]
[align=left] }else{ [/align]
[align=left] /*如果不是自定义的错误显示系统性错误或同一错误*/[/align]
[align=left] res.findMessage(ResponseData.SYSTEM_EXCEPTION);[/align]
[align=left] res.setMessage(thr.getMessage());[/align]
[align=left] }[/align]
returnres;
[align=left] }else{[/align]
[align=left] /*如果不是Ajax的重从定向到错误界面*/[/align]
[align=left] returnnewModelAndView("redirect:/categoryAttribute");[/align]
[align=left] }[/align]
[align=left] }[/align]
privateThrowable
getRootCause(Throwablethrowable) {
while(throwable.getCause()
!=null) {
throwable=throwable.getCause();
[align=left] }[/align]
if(throwableinstanceofOgnlException
&& ((OgnlException)throwable).getReason() !=null)
{
[align=left] returngetRootCause(((OgnlException)throwable).getReason());[/align]
[align=left] }[/align]
[align=left] returnthrowable;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
(2)建立一个终态的类RequestUtil
判断请求类型
[align=left]
[/align]
[align=left]packagecom.ggs.mstd.CustomException;[/align]
[align=left]importjavax.servlet.http.Cookie;[/align]
[align=left]importjavax.servlet.http.HttpServletRequest;[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] *@authorwenfei.fang[/align]
[align=left] *[/align]
[align=left] * 2016年11月11日[/align]
[align=left] */[/align]
publicfinalclassRequestUtil
{
[align=left]
[/align]
[align=left] publicstaticfinalStringX_REQUESTED_WIDTH="X-Requested-With";[/align]
[align=left] publicstaticfinalStringXML_HTTP_REQUEST="XMLHttpRequest";[/align]
[align=left]
[/align]
privateRequestUtil()
{
[align=left] }[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 判断是否ajax请求.[/align]
* 可以看到Ajax
请求多了个 x-requested-with
,可以利用它,
* request.getHeader("x-requested-with");
为 null,则为传统同步请求,为 XMLHttpRequest,则为Ajax
异步请求。
*@paramrequest
HttpServletRequest
[align=left] *@return是否ajax请求.[/align]
[align=left] */[/align]
publicstaticbooleanisAjaxRequest(HttpServletRequestrequest)
{
[align=left] Stringxr=request.getHeader(X_REQUESTED_WIDTH);[/align]
[align=left] return(xr!=null&&XML_HTTP_REQUEST.equalsIgnoreCase(xr));[/align]
[align=left] }[/align]
[align=left]
[/align]
publicstaticString
getCookieValue(HttpServletRequestrequest, Stringname)
{
[align=left] Cookie[]cookies=request.getCookies();[/align]
if(cookies!=null)
{
for(Cookiecookie:cookies)
{
[align=left] StringcookieName=cookie.getName();[/align]
if(cookieName.equals(name))
{
[align=left] returncookie.getValue();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] returnnull;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left](3)建立一个类 继承 Exception[/align]
[align=left]
[/align]
publicabstractclassCustomExceptionextendsException
{
[align=left]
[/align]
privatestaticfinallongserialVersionUID=
1L;
[align=left]
[/align]
[align=left] // e.g. ORDER_FROZEN[/align]
[align=left] privateStringcode;[/align]
[align=left]
[/align]
[align=left] privateStringdescriptionKey;[/align]
[align=left]
[/align]
[align=left] privateObject[]parameters;[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 不应该直接实例化,应该定义子类.[/align]
[align=left] *[/align]
[align=left] *@paramcode[/align]
[align=left] * 异常 code,通常与模块 CODE 对应[/align]
[align=left] *@paramdescriptionKey[/align]
[align=left] * 异常消息代码,系统描述中定义[/align]
[align=left] *@paramparameters[/align]
[align=left] * 如果没有参数,可以传 null[/align]
[align=left] */[/align]
protectedCustomException(Stringcode,
StringdescriptionKey, Object[]parameters)
{
[align=left] super(descriptionKey);[/align]
[align=left] this.code=code;[/align]
[align=left] this.descriptionKey=descriptionKey;[/align]
[align=left] this.parameters=parameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getCode() {
[align=left] returncode;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getDescriptionKey() {
[align=left] returndescriptionKey;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicObject[]
getParameters() {
[align=left] returnparameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetCode(Stringcode)
{
[align=left] this.code=code;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetDescriptionKey(StringdescriptionKey)
{
[align=left] this.descriptionKey=descriptionKey;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetParameters(Object[]parameters)
{
[align=left] this.parameters=parameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left](4)错误处理类[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 数据返回对象.[/align]
[align=left] *[/align]
[align=left] *@authorwenfei.fang@hand-china.com[/align]
[align=left] */[/align]
[align=left]publicclassResponseData{[/align]
[align=left]
[/align]
[align=left] [/align]
publicstaticfinalStringSYSTEM_EXCEPTION="Please
contact the administrator.";
publicstaticfinalStringMSG_ERROR_APPROVE_COMMENTS="msg
error approve comments";
[align=left] [/align]
[align=left] public voidfindMessage(Stringcode){[/align]
[align=left] this.message=code==null?SYSTEM_EXCEPTION:code;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] // 返回状态编码[/align]
[align=left] [/align]
[align=left] privateStringcode;[/align]
[align=left]
[/align]
[align=left] // 返回信息[/align]
[align=left] [/align]
[align=left] privateStringmessage;[/align]
[align=left]
[/align]
publicString
getCode() {
[align=left] returncode;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetCode(Stringcode)
{
[align=left] this.code=code;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getMessage() {
[align=left] returnmessage;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetMessage(Stringmessage)
{
[align=left] this.message=message;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left](5)Controller继承CustomExceptionResolver错误处理[/align]
[align=left]@Controller[/align]
[align=left]public class MegaFileReportController extends CustomExceptionResolver{[/align]
[align=left] @RequestMapping(value = "/api/megaFile/e")[/align]
[align=left]public @ResponseBody String e(@RequestParam Map<String, Object> params) {[/align]
[align=left]int m=1/0;[/align]
[align=left]return null;[/align]
[align=left]}[/align]
[align=left]} [/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
packagecom.ggs.mstd.controller;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.ibatis.ognl.OgnlException;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.servlet.ModelAndView;
importcom.ggs.mstd.CustomException.CustomException;
importcom.ggs.mstd.CustomException.RequestUtil;
importcom.ggs.mstd.CustomException.ResponseData;
[align=left]@Controller[/align]
publicclassCustomExceptionResolver
{
[align=left]
[/align]
[align=left]
[/align]
[align=left] /**@authorwenfei.fang@hand-china.com[/align]
[align=left] * 处理控制层所有异常.[/align]
*@paramexception
未捕获的异常
*@paramrequest
HttpServletRequest
*@returnResponseData(BaseException
被处理) 或者 ModelAndView(其他 Exception ,500错误)
[align=left] */[/align]
@ExceptionHandler(value
= { Exception.class})
public@ResponseBody
Object exceptionHandler(Exceptionexception, HttpServletRequestrequest,
HttpServletResponseresponse) {
[align=left] /*判断请求类型是不是ajax的*/[/align]
if(RequestUtil.isAjaxRequest(request))
{
/*如果是Ajax请求将错误信息返回到ajax
date*/
Throwablethr=
getRootCause(exception);
[align=left] ResponseDatares=newResponseData();[/align]
if(thrinstanceofCustomException)
{
[align=left] /*如果自定义的错误显示自定义的错误类型*/[/align]
CustomExceptionbe=
(CustomException)thr;
[align=left] res.findMessage(be.getCode());[/align]
[align=left] res.setCode(be.getCode());[/align]
[align=left] res.setMessage(be.getMessage());[/align]
[align=left] }else{ [/align]
[align=left] /*如果不是自定义的错误显示系统性错误或同一错误*/[/align]
[align=left] res.findMessage(ResponseData.SYSTEM_EXCEPTION);[/align]
[align=left] res.setMessage(thr.getMessage());[/align]
[align=left] }[/align]
returnres;
[align=left] }else{[/align]
[align=left] /*如果不是Ajax的重从定向到错误界面*/[/align]
[align=left] returnnewModelAndView("redirect:/categoryAttribute");[/align]
[align=left] }[/align]
[align=left] }[/align]
privateThrowable
getRootCause(Throwablethrowable) {
while(throwable.getCause()
!=null) {
throwable=throwable.getCause();
[align=left] }[/align]
if(throwableinstanceofOgnlException
&& ((OgnlException)throwable).getReason() !=null)
{
[align=left] returngetRootCause(((OgnlException)throwable).getReason());[/align]
[align=left] }[/align]
[align=left] returnthrowable;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
(2)建立一个终态的类RequestUtil
判断请求类型
[align=left]
[/align]
[align=left]packagecom.ggs.mstd.CustomException;[/align]
[align=left]importjavax.servlet.http.Cookie;[/align]
[align=left]importjavax.servlet.http.HttpServletRequest;[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] *@authorwenfei.fang[/align]
[align=left] *[/align]
[align=left] * 2016年11月11日[/align]
[align=left] */[/align]
publicfinalclassRequestUtil
{
[align=left]
[/align]
[align=left] publicstaticfinalStringX_REQUESTED_WIDTH="X-Requested-With";[/align]
[align=left] publicstaticfinalStringXML_HTTP_REQUEST="XMLHttpRequest";[/align]
[align=left]
[/align]
privateRequestUtil()
{
[align=left] }[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 判断是否ajax请求.[/align]
* 可以看到Ajax
请求多了个 x-requested-with
,可以利用它,
* request.getHeader("x-requested-with");
为 null,则为传统同步请求,为 XMLHttpRequest,则为Ajax
异步请求。
*@paramrequest
HttpServletRequest
[align=left] *@return是否ajax请求.[/align]
[align=left] */[/align]
publicstaticbooleanisAjaxRequest(HttpServletRequestrequest)
{
[align=left] Stringxr=request.getHeader(X_REQUESTED_WIDTH);[/align]
[align=left] return(xr!=null&&XML_HTTP_REQUEST.equalsIgnoreCase(xr));[/align]
[align=left] }[/align]
[align=left]
[/align]
publicstaticString
getCookieValue(HttpServletRequestrequest, Stringname)
{
[align=left] Cookie[]cookies=request.getCookies();[/align]
if(cookies!=null)
{
for(Cookiecookie:cookies)
{
[align=left] StringcookieName=cookie.getName();[/align]
if(cookieName.equals(name))
{
[align=left] returncookie.getValue();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] returnnull;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left](3)建立一个类 继承 Exception[/align]
[align=left]
[/align]
publicabstractclassCustomExceptionextendsException
{
[align=left]
[/align]
privatestaticfinallongserialVersionUID=
1L;
[align=left]
[/align]
[align=left] // e.g. ORDER_FROZEN[/align]
[align=left] privateStringcode;[/align]
[align=left]
[/align]
[align=left] privateStringdescriptionKey;[/align]
[align=left]
[/align]
[align=left] privateObject[]parameters;[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 不应该直接实例化,应该定义子类.[/align]
[align=left] *[/align]
[align=left] *@paramcode[/align]
[align=left] * 异常 code,通常与模块 CODE 对应[/align]
[align=left] *@paramdescriptionKey[/align]
[align=left] * 异常消息代码,系统描述中定义[/align]
[align=left] *@paramparameters[/align]
[align=left] * 如果没有参数,可以传 null[/align]
[align=left] */[/align]
protectedCustomException(Stringcode,
StringdescriptionKey, Object[]parameters)
{
[align=left] super(descriptionKey);[/align]
[align=left] this.code=code;[/align]
[align=left] this.descriptionKey=descriptionKey;[/align]
[align=left] this.parameters=parameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getCode() {
[align=left] returncode;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getDescriptionKey() {
[align=left] returndescriptionKey;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicObject[]
getParameters() {
[align=left] returnparameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetCode(Stringcode)
{
[align=left] this.code=code;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetDescriptionKey(StringdescriptionKey)
{
[align=left] this.descriptionKey=descriptionKey;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetParameters(Object[]parameters)
{
[align=left] this.parameters=parameters;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left](4)错误处理类[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 数据返回对象.[/align]
[align=left] *[/align]
[align=left] *@authorwenfei.fang@hand-china.com[/align]
[align=left] */[/align]
[align=left]publicclassResponseData{[/align]
[align=left]
[/align]
[align=left] [/align]
publicstaticfinalStringSYSTEM_EXCEPTION="Please
contact the administrator.";
publicstaticfinalStringMSG_ERROR_APPROVE_COMMENTS="msg
error approve comments";
[align=left] [/align]
[align=left] public voidfindMessage(Stringcode){[/align]
[align=left] this.message=code==null?SYSTEM_EXCEPTION:code;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] // 返回状态编码[/align]
[align=left] [/align]
[align=left] privateStringcode;[/align]
[align=left]
[/align]
[align=left] // 返回信息[/align]
[align=left] [/align]
[align=left] privateStringmessage;[/align]
[align=left]
[/align]
publicString
getCode() {
[align=left] returncode;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetCode(Stringcode)
{
[align=left] this.code=code;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicString
getMessage() {
[align=left] returnmessage;[/align]
[align=left] }[/align]
[align=left]
[/align]
publicvoidsetMessage(Stringmessage)
{
[align=left] this.message=message;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left](5)Controller继承CustomExceptionResolver错误处理[/align]
[align=left]@Controller[/align]
[align=left]public class MegaFileReportController extends CustomExceptionResolver{[/align]
[align=left] @RequestMapping(value = "/api/megaFile/e")[/align]
[align=left]public @ResponseBody String e(@RequestParam Map<String, Object> params) {[/align]
[align=left]int m=1/0;[/align]
[align=left]return null;[/align]
[align=left]}[/align]
[align=left]} [/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
相关文章推荐
- Spring MVC异常统一处理(包括普通请求异常以及ajax请求异常)
- Spring MVC异常统一处理(包括普通请求异常以及ajax请求异常)
- Spring MVC异常统一处理(包括普通请求异常以及ajax请求异常)
- Spring MVC统一异常处理(包含普通请求异常和ajax请求异常)
- Spring MVC的Controller统一异常处理:HandlerExceptionResolver
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- Struts2、Spring MVC4 框架下的ajax统一异常处理
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- SpringMVC对异常进行全局处理,并区分对待ajax和普通请求
- 使用struts2处理普通http请求和ajax请求的对比
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战
- 想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常
- 使用Spring MVC统一异常处理实战
- 使用Spring MVC统一异常处理实战