Spring MVC全局异常后返回JSON异常数据
问题:
当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发。后台服务与手机端交互是发送JSON数据。如果后台发生异常,会直接返回异常页面,显示异常内容,如果是404请求不到资源或者500这类服务器的问题,可能会导致返回404和500异常页面,手机端的处理就非常麻烦,为了解决这个问题,就需要做全局的异常处理。
解决方案:
(1)自定义或者使用spring自带的各种异常处理器
例如spring基于注解的异常解析器AnnotationHandlerMethodExceptionResolver 、spring自带全局异常处理器SimpleMappingExceptionResolver、自定义实现spring的全局异常解析器HandlerExceptionResolver来处理。
AnnotationHandlerMethodExceptionResolver目前我所知道的是需要在方法上定义异常的类型,如果异常类型多了,写起代码太麻烦,所以我认为不好用。(那位大侠知道不用定义异常类型就处理所有异常,可以留言告诉我,谢谢!)
spring自带全局异常处理器SimpleMappingExceptionResolver也是比较繁琐的,需要配置的地方太多了,不喜欢用。
自定义实现spring的全局异常解析器HandlerExceptionResolver来处理我认为是最方便的,当然,这个是针对我目前的业务场景而言,并不是绝对的。
由于Java的异常机制,如果发生大量异常,对jvm的性能会产生很大的影响,轻则性能下降10%,重则导致jvm内存溢出,我个人认为能不抛异常就最好不抛,所以,我主要使用自定义实现spring的全局异常解析器HandlerExceptionResolver来处理业务问题。
(2)自定义实现spring的全局异常解析器HandlerExceptionResolver
2.1 只需要在spring-mvc的配置文件中定义一个全局异常处理类
- <!-- 全局异常处理 -->
- <bean id="exceptionHandler" class="com.aaa.bbb.exception.DefaultExceptionHandler" />
2.2 实现HandlerExceptionResolver(第一种实现方式)
这种方式需要下载温少写的fastjson,我用的是1.2.6版本,可以百度后自己下载。
- public class DefaultExceptionHandler implements HandlerExceptionResolver {
- private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);
- public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
- ModelAndView mv = new ModelAndView();
- /* 使用FastJson提供的FastJsonJsonView视图返回,不需要捕获异常 */
- FastJsonJsonView view = new FastJsonJsonView();
- Map<String, Object> attributes = new HashMap<String, Object>();
- attributes.put("code", "1000001");
- attributes.put("msg", ex.getMessage());
- view.setAttributesMap(attributes);
- mv.setView(view);
- log.debug("异常:" + ex.getMessage(), ex);
- return mv;
- }
- }
2.2 实现HandlerExceptionResolver(第二种实现方式)
- public class DefaultExceptionHandler implements HandlerExceptionResolver {
- private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);
- public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
- ModelAndView mv = new ModelAndView();
- /* 使用response返回 */
- response.setStatus(HttpStatus.OK.value()); //设置状态码
- response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
- response.setCharacterEncoding("UTF-8"); //避免乱码
- response.setHeader("Cache-Control", "no-cache, must-revalidate");
- try {
- response.getWriter().write("{\"success\":false,\"msg\":\"" + ex.getMessage() + "\"}");
- } catch (IOException e) {
- log.error("与客户端通讯异常:"+ e.getMessage(), e);
- }
- log.debug("异常:" + ex.getMessage(), ex);
- return mv;
- }
- }
到此,spring mvc全局异常处理返回json就搞定了,发生异常后,返回的都是json数据,不会再有烦人的异常内容。不过这还不算完整,需要在web.xml中加入异常代码404或者500的处理才能算完。
(1)web页面异常处理配置
1.1 <exception-type>java.lang.Throwable</exception-type>表示发生java.lang.Throwable类型的异常,<location>/error_500</location>表示到/error_500地址处理,
例如用户请求【http://www.a.com/user/login/getUser】 ,应用名称是user,如果请求发生java.lang.Throwable,那么请求会转到【http://www.a.com/user/error_500】
1.2 <error-code>404</error-code>表示发生404请求失败,<location>/error_404</location>表示到/error_404处理,
例如用户请求【http://www.a.com/user/login/getUser】,应用名称是user ,如果用户请求发生404异常,请求资源找不到,那么请求会转到【http://www.a.com/user/error_404】
- <!-- web异常页面处理 -->
- <error-page>
- <exception-type>java.lang.Throwable</exception-type>
- <location>/error_500</location>
- </error-page>
- <error-page>
- <exception-type>java.lang.Exception</exception-type>
- <location>/error_404</location>
- </error-page>
- <error-page>
- <error-code>500</error-code>
- <location>/error_500</location>
- </error-page>
- <error-page>
- <error-code>501</error-code>
- <location>/error_500</location>
- </error-page>
- <error-page>
- <error-code>502</error-code>
- <location>/error_500</location>
- </error-page>
- <error-page>
- <error-code>404</error-code>
- <location>/error_404</location>
- </error-page>
- <error-page>
- <error-code>403</error-code>
- <location>/error_404</location>
- </error-page>
- <error-page>
- <error-code>400</error-code>
- <location>/error_404</location>
- </error-page>
(2)后台处理
如果发生以上异常,请求会转到【http://www.a.com/user/error_404】,那么在后台就需要做相应的处理,处理方式就是在Controller层定义处理异常的方法
- /**
- * 请求异常
- * @return
- * @throws Exception
- * String
- */
- @RequestMapping(value = "/error_404", produces = "text/html;charset=UTF-8")
- @ResponseBody
- public String error_404() throws Exception {
- return "{\"msg\":\"找不到页面\",\"code\":\"1000001\"}";
- }
- /**
- * 服务器异常
- * @return
- * String
- */
- @RequestMapping(value ="/error_500", produces = "text/html;charset=UTF-8")
- public String error_500() { <pre name="code" class="java"> return "{\"msg\":\"服务器处理失败\",\"code\":\"1000002\"}";
- }
最后,基本上所有的异常都能被捕获,能够出现异常时,友好的提示用户端,也能避免服务器端抛异常导致的问题。
Spring MVC全局异常后返回JSON异常数据的更多相关文章
- springmvc全局异常后返回JSON异常数据
转自:http://www.cnblogs.com/exmyth/p/5601288.html (1)自定义或者使用spring自带的各种异常处理器 例如spring基于注解的异常解析器Annotat ...
- 160506、Spring mvc新手入门(11)-返回json 字符串的其他方式
Spring MVC返回 json字符串的方式有很多种方法,这里介绍最简单,也是最常使用的两种方式 一.使用 PrintWriter printWriter 直接输出字符串到返回结果中 不需 ...
- spring mvc 利用匿名内部类构建返回json对象
@RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Spring MVC 全局异常处理&文件上传
Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...
- Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object
Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object 资料参考:http://stack ...
- spring mvc接收ajax提交的JSON数据,并反序列化为对象
需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...
- Struts2+Jquery实现ajax并返回json类型数据
来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...
- 转载:Struts2+Jquery实现ajax并返回json类型数据
摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...
随机推荐
- I.MX6 mkuserimg.sh hacking
/*********************************************************************** * I.MX6 mkuserimg.sh hackin ...
- mysql数据恢复失败记录
今天遇到了MySQL有几个数据表空间丢失的问题,作为一个外行尝试好久没恢复成功,考虑到只是几个基础数据表,就删除数据表停止服务,删除ibd文件后再创新创建表解决了问题. 近期的一些事让我不像以前一样钻 ...
- Java Socket实战之五:使用加密协议传输对象
转自:http://developer.51cto.com/art/201202/317547.htm 前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据 ...
- LA 4670 Dominating Patterns (AC自动机)
题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...
- Ruby 数式匹配器
str = "x^2 + 12317 +X^2 - Length" str = " x ^ 2 + y ...
- zoj 2587 Unique Attack【最小割】
拆点拆魔怔了 直接按照原图建就行,这里有个小技巧就是双向边的话不用按着板子建(u,v,c)(v,u,0)(v,u,c)(u,v,0),直接建(u,v,c)(v,u,c)会快十倍!800ms->8 ...
- P4949 最短距离(树链剖分+树状数组+基环树)
传送门 一个中午啊-- 本来打算用仙人掌搞的,后来发现直接基环树就可以了,把多出来的那条边单独记录为\((dx,dy,dw)\),剩下的树剖 然后最短路径要么直接树上跑,要么经过多出来的边,分别讨论就 ...
- LuoguP1063 能量项链【区间Dp】
前天测试考了QAQ.这么经典的区间dp不再开一文好像有点可惜. 内容是从模拟赛结题报告中copy来的.QAQ noip能量项链原题. https://www.luogu.org/problemnew/ ...
- Centos 7 chrome
share from https://www.cnblogs.com/lenmom/p/9195581.html 1. 下载Chrome浏览器的rpm包 https://www.chrome64bit ...
- php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行?
问答 问答详情 php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行? centos apache linux html php 3.2k 次浏 ...