您的位置:首页 > 编程语言 > Java开发

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: