需要以下两个类配合完成:
IoExceptionHandler.java(异常助手类)IMoocJSONResult.java(实体类)
package com.blog.pojo; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import java.util.List; public class IMoocJSONResult { // 定义jackson对象 private static final ObjectMapper MAPPER = new ObjectMapper(); // 响应业务状态 private Integer status; // 响应消息 private String msg; // 响应中的数据 private Object data; private String ok; // 不使用 public static IMoocJSONResult build(Integer status, String msg, Object data) { return new IMoocJSONResult(status, msg, data); } public static IMoocJSONResult ok(Object data) { return new IMoocJSONResult(data); } public static IMoocJSONResult ok() { return new IMoocJSONResult(null); } public static IMoocJSONResult errorMsg(String msg) { return new IMoocJSONResult(500, msg, null); } public static IMoocJSONResult errorMap(Object data) { return new IMoocJSONResult(501, "error", data); } public static IMoocJSONResult errorTokenMsg(String msg) { return new IMoocJSONResult(502, msg, null); } public static IMoocJSONResult errorException(String msg) { return new IMoocJSONResult(555, msg, null); } public IMoocJSONResult() { } // public static LeeJSONResult build(Integer status, String msg) { // return new LeeJSONResult(status, msg, null); // } public IMoocJSONResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } public IMoocJSONResult(Object data) { this.status = 200; this.msg = "OK"; this.data = data; } public Boolean isOK() { return this.status == 200; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } /** * * @Description: 将json结果集转化为LeeJSONResult对象 * 需要转换的对象是一个类 * @param jsonData * @param clazz * @return * * @author leechenxiang * @date 2016年4月22日 下午8:34:58 */ public static IMoocJSONResult formatToPojo(String jsonData, Class<?> clazz) { try { if (clazz == null) { return MAPPER.readValue(jsonData, IMoocJSONResult.class); } JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (clazz != null) { if (data.isObject()) { obj = MAPPER.readValue(data.traverse(), clazz); } else if (data.isTextual()) { obj = MAPPER.readValue(data.asText(), clazz); } } return build(jsonNode.get("status").getIntValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } /** * * @Description: 没有object对象的转化 * @param json * @return * * @author leechenxiang * @date 2016年4月22日 下午8:35:21 */ public static IMoocJSONResult format(String json) { try { return MAPPER.readValue(json, IMoocJSONResult.class); } catch (Exception e) { e.printStackTrace(); } return null; } /** * * @Description: Object是集合转化 * 需要转换的对象是一个list * @param jsonData * @param clazz * @return * * @author leechenxiang * @date 2016年4月22日 下午8:35:31 */ public static IMoocJSONResult formatToList(String jsonData, Class<?> clazz) { try { JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (data.isArray() && data.size() > 0) { obj = MAPPER.readValue(data.traverse(), MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } return build(jsonNode.get("status").getIntValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } public String getOk() { return ok; } public void setOk(String ok) { this.ok = ok; } }
package com.blog.util; import com.blog.pojo.IMoocJSONResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @ControllerAdvice public class IoExceptionHandler { //错误页面路径 private final static String IMOOC_ERROR_VIEW = "/homepage/404"; @ExceptionHandler(value=Exception.class) public Object errorHandler(HttpServletRequest request, HttpServletResponse response,Exception e) throws Exception{ e.printStackTrace(); if(isAjax(request)){ return IMoocJSONResult.errorException(e.getMessage()); } else { ModelAndView mav = new ModelAndView(); //返回错误异常 mav.addObject("exception",e); //返回错误方法的路径 mav.addObject("url",request.getRequestURL()); //返回错误页面路径 mav.setViewName(IMOOC_ERROR_VIEW); return mav; } } /* * 判断异常是否是ajax异常 * */ public static boolean isAjax(HttpServletRequest httpRequest){ return (httpRequest.getHeader("X-Requested-With") !=null && "XMLHttpRequest".equals(httpRequest.getHeader("X-Requested-With").toString() ) ); } }
下面测试一下:
404.html
<!doctype html> <html lang="zh-CN" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>404错误!很抱歉,您要找的页面不存在</title> <link rel="stylesheet" type="text/css" href="/homepage/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/homepage/css/nprogress.css"> <link rel="stylesheet" type="text/css" href="/homepage/css/style.css"> <link rel="stylesheet" type="text/css" href="/homepage/css/font-awesome.min.css"> <link rel="apple-touch-icon-precomposed" href="/homepage/images/icon/icon.png"> <link rel="shortcut icon" href="/homepage/images/icon/favicon.ico"> <script src="/homepage/js/jquery-2.1.4.min.js"></script> <script src="/homepage/js/nprogress.js"></script> <script src="/homepage/js/jquery.lazyload.min.js"></script> <!--[if gte IE 9]> <script src="/homepage/js/jquery-1.11.1.min.js" type="text/javascript"></script> <script src="/homepage/js/html5shiv.min.js" type="text/javascript"></script> <script src="/homepage/js/respond.min.js" type="text/javascript"></script> <script src="/homepage/js/selectivizr-min.js" type="text/javascript"></script> <![endif]--> <!--[if lt IE 9]> <script>window.location.href='upgrade-browser.html';</script> <![endif]--> <style type="text/css"> .panel{ padding:80px 20px 0px; min-height:500px; cursor:default; } .text-center { margin:0 auto; text-align: center; border-radius:10px; max-width:900px; -moz-box-shadow: 0px 0px 5px rgba(0,0,0,.3); -webkit-box-shadow: 0px 0px 5px rgba(0,0,0,.3); box-shadow: 0px 0px 5px rgba(0,0,0,.1); } .float-left { float: left !important; } .float-right { float: right !important; } img { border: 0; vertical-align: bottom; } h2 { padding-top: 20px; font-size: 20px; } .padding-big { padding: 20px; } .alert { border-radius: 5px; padding: 15px; border: solid 1px #ddd; background-color: #f5f5f5; } </style> </head> <body class="user-select"> <header class="header"> <nav class="navbar navbar-default" id="navbar"> <div class="container"> <div class="header-topbar hidden-xs link-border"> <ul class="site-nav topmenu"> <li><a href="tags.html">标签云</a></li> <li><a href="readers.html" rel="nofollow">读者墙</a></li> <li><a href="links.html" rel="nofollow">友情链接</a></li> <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" rel="nofollow">关注本站 <span class="caret"></span></a> <ul class="dropdown-menu header-topbar-dropdown-menu"> <li><a data-toggle="modal" data-target="#WeChat" rel="nofollow"><i class="fa fa-weixin"></i> 微信</a></li> <li><li><a href="//shang.qq.com/wpa/qunwpa?idkey=225f72ba399ffadea6d01bb6c597bcb30a3ce14999d150746212d6646a5c4933" rel="nofollow"><i class="fa fa-qq"></i> QQ</a></li> <li><a data-toggle="modal" data-target="#areDeveloping" rel="nofollow"><i class="fa fa-rss"></i> RSS</a></li> </ul> </li> </ul> <a href="javascript:;" class="login" rel="nofollow">Hi,您好~</a> </div> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#header-navbar" aria-expanded="false"> <span class="sr-only"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button></li> <h1 class="logo hvr-bounce-in"><a href="/blog/index" title=""><img src="/homepage/images/logo.png" alt=""></a></h1> </div> <div class="collapse navbar-collapse" id="header-navbar"> <ul class="nav navbar-nav navbar-right"> <li class="hidden-index active"><a data-cont="首页" href="/blog/index">首页</a></li> <li><a href="/blog/procedure">程序</a></li> <li><a href="/blog/life">人生</a></li> </ul> <form class="navbar-form visible-xs" action="/Search" method="post"> <div class="input-group"> <input type="text" name="keyword" class="form-control" placeholder="请输入关键字" maxlength="20" autocomplete="off"> <span class="input-group-btn"> <button class="btn btn-default btn-search" name="search" type="submit">搜索</button> </span> </div> </form> </div> </div> </nav> </header> <section class="container"> <div class="panel"> <div class="text-center"> <h2><stong>404错误!很抱歉,您要找的页面不存在</stong></h2> <div th:text="${url}"></div> <div th:text="${exception.message}"></div> <div> <div class="float-left"> <img src="/homepage/images/404/left.gif" alt="" /> <div class="alert"> 卧槽!页面不见了! </div> </div> <div class="float-right"> <img src="/homepage/images/404/right.png" width="260" class="hidden-xs" alt="" /> </div> </div> <div class="padding-big"> <a href="/blog/index" class="btn btn-primary">返回首页</a> <a href="" class="btn btn-default">保证不打死管理员</a> </div> </div> </div> </section> <footer class="footer"> <div class="container"> <p>© 2016 <a href="">ylsat.com</a> <a href="#" target="_blank" rel="nofollow">豫ICP备20151109-1</a> <a href="http://www.mycodes.net/" target="_blank">源码之家</a></p> </div> <div id="gotop"><a class="gotop"></a></div> </footer> <!--微信二维码模态框--> <div class="modal fade user-select" id="WeChat" tabindex="-1" role="dialog" aria-labelledby="WeChatModalLabel"> <div class="modal-dialog" role="document" style="margin-top:120px;width:280px;"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="WeChatModalLabel" style="cursor:default;">微信扫一扫</h4> </div> <div class="modal-body" style="text-align:center"> <img src="/homepage/images/weixin.jpg" alt="" style="cursor:pointer"/> </div> </div> </div> </div> <!--该功能正在日以继夜的开发中--> <div class="modal fade user-select" id="areDeveloping" tabindex="-1" role="dialog" aria-labelledby="areDevelopingModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="areDevelopingModalLabel" style="cursor:default;">该功能正在日以继夜的开发中…</h4> </div> <div class="modal-body"> <img src="/homepage/images/baoman/baoman_01.gif" alt="深思熟虑" /><p style="padding:15px 15px 15px 100px; position:absolute; top:15px; cursor:default;">很抱歉,程序猿正在日以继夜的开发此功能,本程序将会在以后的版本中持续完善!</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal">朕已阅</button> </div> </div> </div> </div> <!--<div id="rightClickMenu"> <ul class="list-group rightClickMenuList"> <li class="list-group-item disabled">欢迎访问博客</li> <li class="list-group-item"><span>IP:</span>172.16.10.129</li> <li class="list-group-item"><span>地址:</span>河南省郑州市</li> <li class="list-group-item"><span>系统:</span>Windows10 </li> <li class="list-group-item"><span>浏览器:</span>Chrome47</li> </ul> </div>--> <script src="/homepage/js/bootstrap.min.js"></script> <script src="/homepage/js/jquery.ias.js"></script> <script src="/homepage/js/scripts.js"></script> </body> </html>
controller:
@Controller @RequestMapping(value={"/blog"} public class BlogController{ @RequestMapping(value = {"/error"}) public String error(){ int a = 1/0; return "404"; } }
此时启动工程,输入localhost/blog/error,因为1/0是错误的,所以跳转到错误页面,并显示错误方法和错误代码,至此异常捕捉成功。