问题:

当前项目是作为手机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的配置文件中定义一个全局异常处理类

  1. <!-- 全局异常处理 -->
  2. <bean id="exceptionHandler" class="com.aaa.bbb.exception.DefaultExceptionHandler" />

2.2  实现HandlerExceptionResolver(第一种实现方式)

这种方式需要下载温少写的fastjson,我用的是1.2.6版本,可以百度后自己下载。

  1. public class DefaultExceptionHandler implements HandlerExceptionResolver {
  2. private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);
  3. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  Exception ex) {
  4. ModelAndView mv = new ModelAndView();
  5. /*  使用FastJson提供的FastJsonJsonView视图返回,不需要捕获异常   */
  6. FastJsonJsonView view = new FastJsonJsonView();
  7. Map<String, Object> attributes = new HashMap<String, Object>();
  8. attributes.put("code", "1000001");
  9. attributes.put("msg", ex.getMessage());
  10. view.setAttributesMap(attributes);
  11. mv.setView(view);
  12. log.debug("异常:" + ex.getMessage(), ex);
  13. return mv;
  14. }
  15. }

2.2  实现HandlerExceptionResolver(第二种实现方式)

  1. public class DefaultExceptionHandler implements HandlerExceptionResolver {
  2. private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);
  3. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  Exception ex) {
  4. ModelAndView mv = new ModelAndView();
  5. /*  使用response返回    */
  6. response.setStatus(HttpStatus.OK.value()); //设置状态码
  7. response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
  8. response.setCharacterEncoding("UTF-8"); //避免乱码
  9. response.setHeader("Cache-Control", "no-cache, must-revalidate");
  10. try {
  11. response.getWriter().write("{\"success\":false,\"msg\":\"" + ex.getMessage() + "\"}");
  12. } catch (IOException e) {
  13. log.error("与客户端通讯异常:"+ e.getMessage(), e);
  14. }
  15. log.debug("异常:" + ex.getMessage(), ex);
  16. return mv;
  17. }
  18. }

到此,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】

  1. <!-- web异常页面处理 -->
  2. <error-page>
  3. <exception-type>java.lang.Throwable</exception-type>
  4. <location>/error_500</location>
  5. </error-page>
  6. <error-page>
  7. <exception-type>java.lang.Exception</exception-type>
  8. <location>/error_404</location>
  9. </error-page>
  10. <error-page>
  11. <error-code>500</error-code>
  12. <location>/error_500</location>
  13. </error-page>
  14. <error-page>
  15. <error-code>501</error-code>
  16. <location>/error_500</location>
  17. </error-page>
  18. <error-page>
  19. <error-code>502</error-code>
  20. <location>/error_500</location>
  21. </error-page>
  22. <error-page>
  23. <error-code>404</error-code>
  24. <location>/error_404</location>
  25. </error-page>
  26. <error-page>
  27. <error-code>403</error-code>
  28. <location>/error_404</location>
  29. </error-page>
  30. <error-page>
  31. <error-code>400</error-code>
  32. <location>/error_404</location>
  33. </error-page>

(2)后台处理

如果发生以上异常,请求会转到【http://www.a.com/user/error_404】,那么在后台就需要做相应的处理,处理方式就是在Controller层定义处理异常的方法

  1. /**
  2. * 请求异常
  3. * @return
  4. * @throws Exception
  5. * String
  6. */
  7. @RequestMapping(value = "/error_404", produces = "text/html;charset=UTF-8")
  8. @ResponseBody
  9. public String error_404() throws Exception {
  10. return "{\"msg\":\"找不到页面\",\"code\":\"1000001\"}";
  11. }
  12. /**
  13. * 服务器异常
  14. * @return
  15. * String
  16. */
  17. @RequestMapping(value ="/error_500", produces = "text/html;charset=UTF-8")
  18. public String error_500() {     <pre name="code" class="java">                return "{\"msg\":\"服务器处理失败\",\"code\":\"1000002\"}";
  19. }

最后,基本上所有的异常都能被捕获,能够出现异常时,友好的提示用户端,也能避免服务器端抛异常导致的问题。

Spring MVC全局异常后返回JSON异常数据的更多相关文章

  1. springmvc全局异常后返回JSON异常数据

    转自:http://www.cnblogs.com/exmyth/p/5601288.html (1)自定义或者使用spring自带的各种异常处理器 例如spring基于注解的异常解析器Annotat ...

  2. 160506、Spring mvc新手入门(11)-返回json 字符串的其他方式

    Spring MVC返回 json字符串的方式有很多种方法,这里介绍最简单,也是最常使用的两种方式 一.使用  PrintWriter printWriter  直接输出字符串到返回结果中    不需 ...

  3. spring mvc 利用匿名内部类构建返回json对象

    @RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Spring MVC 全局异常处理&文件上传

    Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...

  6. 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 ...

  7. spring mvc接收ajax提交的JSON数据,并反序列化为对象

    需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...

  8. Struts2+Jquery实现ajax并返回json类型数据

    来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...

  9. 转载:Struts2+Jquery实现ajax并返回json类型数据

    摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...

随机推荐

  1. JS获得本月的第一天和最后一天

    <script> //本月第一天  function showFirstDay()  {      var Nowdate=new Date();      var MonthFirstD ...

  2. C++中class在实例化前到底占用多少空间

    最近忽然想起一个问题,C++中class在实例化前到底占用多少空间?我隐约记得书上是这么说的“类在实例化时才分配空间”!但是当我写下这个小程序的时候,杯具产生了—— #include<iostr ...

  3. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  4. 创建Mesh->格子地图转NavMesh->可破坏墙壁

    1. 前言     最近连续做了很多代码动态生成Mesh的工作,从动态生成修改瞄准范围的Mesh到可破坏的墙壁,以及之前写了一半导航网格生成.     想借此机会整理下最近的积累,如果在阅读过程中发现 ...

  5. Linux 常用命令五 软链接和硬链接

    一.软链接 相当于windows的快捷方式,当源文件不存在时,软链接失效. 创建软链接: wang@wang:~/workpalce/python$ ls -l 总用量 -rw-rw-r-- wang ...

  6. bzoj 4385: [POI2015]Wilcze doły【单调栈】

    对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...

  7. bzoj 1007: [HNOI2008]水平可见直线【半平面交】

    其实并不算标准半平面交?但是思路差不多 先按照斜率排序,然后用栈维护凸壳,每遇到重斜率或a[i],s[top-1]交点的x轴在s[top],s[top-1]交点左侧,则说明s[top]被a[i],s[ ...

  8. bzoj 1951: [Sdoi2010]古代猪文 【中国剩余定理+欧拉定理+组合数学+卢卡斯定理】

    首先化简,题目要求的是 \[ G^{\sum_{i|n}C_{n}^{i}}\%p \] 对于乘方形式快速幂就行了,因为p是质数,所以可以用欧拉定理 \[ G^{\sum_{i|n}C_{n}^{i} ...

  9. sql server 查看版本

    SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'),SERVERPROPERTY ('edition') ...

  10. socket servlet webservice 区别及使用场景

    原文地址: http://blog.csdn.net/sdjkjsdh/article/details/51569481 1. Socket:使用TCP/IP或者UDP协议在服务器与客户端之间进行传输 ...