问题:

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

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 attributes = new HashMap();

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  java.lang.Throwable表示发生java.lang.Throwable类型的异常,/error_500表示到/error_500地址处理,

例如用户请求【http://www.a.com/user/login/getUser】 ,应用名称是user,如果请求发生java.lang.Throwable,那么请求会转到【http://www.a.com/user/error_500】

1.2 404表示发生404请求失败,/error_404表示到/error_404处理,

例如用户请求【http://www.a.com/user/login/getUser】,应用名称是user ,如果用户请求发生404异常,请求资源找不到,那么请求会转到【http://www.a.com/user/error_404】

java.lang.Throwable

/error_500

java.lang.Exception

/error_404

500

/error_500

501

/error_500

502

/error_500

404

/error_404

403

/error_404

400

/error_404

(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() {

                return "{\"msg\":\"服务器处理失败\",\"code\":\"1000002\"}";

}

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

java 异常返回json_Spring MVC全局异常后返回JSON异常数据相关推荐

  1. vue跳转页面之后返回_vue页面跳转后返回原页面初始位置方法

    vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?首先我们应该在跳出页面时候记录下跳出的scrollY,返回原页面的时候在设置返回位置为记录下的 ...

  2. java url 返回值_java提交url后返回值怎么取

    展开全部 我给楼主一个小的例子,服务62616964757a686964616fe4b893e5b19e31333332643935端负责接收请求,并且返回"0|提交成功|70.00&quo ...

  3. java后台接收数据格式_Java后台基于POST获取JSON格式数据

    1.直接使用request.getParamater()的方法获取(这种取参方式对于POST和GET的提交方式均适用): 2.通过请求体的IO流获取参数(这种方式只能用于POST,因为GET方式没有请 ...

  4. Spring MVC全局异常后返回JSON异常数据

    Spring MVC全局异常后返回JSON异常数据 参考文章: (1)Spring MVC全局异常后返回JSON异常数据 (2)https://www.cnblogs.com/exmyth/p/560 ...

  5. java报错空指针异常_springboot全局异常捕获,真香

    全局异常捕获 什么是异常?程序在启动或者运行时没有按照预期的执行,在执行途中发生某种未知的错误,导致程序非正常停止或者报错. 在我们的程序中,肯定会伴随着很多的异常,启动时:空对象.找不到数据库.用户 ...

  6. AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值

    AOP开发 @Transactionl 在不修改源代码的前提下,对类里面的方法进行增强 前置 后置 环绕 异常 创建项目前引入aop的包 <dependency>     <grou ...

  7. 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常

    1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...

  8. java purge_springboot之全局处理统一返回

    springboot之全局处理统一返回 简介 在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息.这里我们通常返回的时候做一次util的包装处理工作,如:Result类似的类,里面 ...

  9. 抑制java对修饰符的检查_Java 7对抑制异常的支持

    抑制java对修饰符的检查 在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法. 添加了新的构造函数和两个新方法以支持"抑 ...

最新文章

  1. 汇编语言第二课作业-实验1
  2. sklearn中的cross_val_score交叉验证
  3. 字符串或文件处理的一个可选流程
  4. SAE取消每日免费云豆赠送机制
  5. 前6个最常用的Redis库
  6. 可拖动的进度条_视频号全新升级!进度条可拖动、支持@、支持转发......
  7. 这样的极客大会千万别停!如今中国太需要为技术传道、为极客正名
  8. swift:创建滚动视图的图片轮播器
  9. 0501 0503 模块区别_金川区西门子控制器模块CPU313C哪里有
  10. 如何在 Mac 上查找和管理 Safari 下载?
  11. iOS app启动图片及icon图片及应用名设置
  12. CANoe——CanTest模块信号测试函数
  13. 服装店商家不离手的十大服装进销存管理软件,快来看看吧
  14. 比管理时间重要 1000 倍的,是管理精力
  15. 内存测试软件 ddr4,DDR4内存测试软件
  16. 商标注册计算机软件app属于第几类,软件商标属于第几类?
  17. 使用nodejs机器学习进行app流量判别
  18. linux子系统的控制台打开方法
  19. 计算机网络——BGP协议
  20. Java数字位数不足前面补0的几种办法

热门文章

  1. 云计算教程学习入门视频课件:云计算架构参考模型
  2. Spring事务方法与非事务方法执行相互调用不回滚,你踩过这个坑没?
  3. 介绍6款热门的SpringCloud微服务开源项目,总有适合你的!
  4. 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方、强烈推荐
  5. 新来的同事把公司现有项目的性能优化了一遍,来看看他是怎么做到的
  6. springboot整合Mybatis例子
  7. Oracle主要概念汇总
  8. Java中printmax的调用形式_媒体类型和响应式设计
  9. idea创建web项目的几种方式(没内容,自用)
  10. docker swarm快速搭建mogodb集群