java 异常返回json_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的配置文件中定义一个全局异常处理类
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异常数据相关推荐
- vue跳转页面之后返回_vue页面跳转后返回原页面初始位置方法
vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?首先我们应该在跳出页面时候记录下跳出的scrollY,返回原页面的时候在设置返回位置为记录下的 ...
- java url 返回值_java提交url后返回值怎么取
展开全部 我给楼主一个小的例子,服务62616964757a686964616fe4b893e5b19e31333332643935端负责接收请求,并且返回"0|提交成功|70.00&quo ...
- java后台接收数据格式_Java后台基于POST获取JSON格式数据
1.直接使用request.getParamater()的方法获取(这种取参方式对于POST和GET的提交方式均适用): 2.通过请求体的IO流获取参数(这种方式只能用于POST,因为GET方式没有请 ...
- Spring MVC全局异常后返回JSON异常数据
Spring MVC全局异常后返回JSON异常数据 参考文章: (1)Spring MVC全局异常后返回JSON异常数据 (2)https://www.cnblogs.com/exmyth/p/560 ...
- java报错空指针异常_springboot全局异常捕获,真香
全局异常捕获 什么是异常?程序在启动或者运行时没有按照预期的执行,在执行途中发生某种未知的错误,导致程序非正常停止或者报错. 在我们的程序中,肯定会伴随着很多的异常,启动时:空对象.找不到数据库.用户 ...
- AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值
AOP开发 @Transactionl 在不修改源代码的前提下,对类里面的方法进行增强 前置 后置 环绕 异常 创建项目前引入aop的包 <dependency> <grou ...
- 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常
1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...
- java purge_springboot之全局处理统一返回
springboot之全局处理统一返回 简介 在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息.这里我们通常返回的时候做一次util的包装处理工作,如:Result类似的类,里面 ...
- 抑制java对修饰符的检查_Java 7对抑制异常的支持
抑制java对修饰符的检查 在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法. 添加了新的构造函数和两个新方法以支持"抑 ...
最新文章
- 汇编语言第二课作业-实验1
- sklearn中的cross_val_score交叉验证
- 字符串或文件处理的一个可选流程
- SAE取消每日免费云豆赠送机制
- 前6个最常用的Redis库
- 可拖动的进度条_视频号全新升级!进度条可拖动、支持@、支持转发......
- 这样的极客大会千万别停!如今中国太需要为技术传道、为极客正名
- swift:创建滚动视图的图片轮播器
- 0501 0503 模块区别_金川区西门子控制器模块CPU313C哪里有
- 如何在 Mac 上查找和管理 Safari 下载?
- iOS app启动图片及icon图片及应用名设置
- CANoe——CanTest模块信号测试函数
- 服装店商家不离手的十大服装进销存管理软件,快来看看吧
- 比管理时间重要 1000 倍的,是管理精力
- 内存测试软件 ddr4,DDR4内存测试软件
- 商标注册计算机软件app属于第几类,软件商标属于第几类?
- 使用nodejs机器学习进行app流量判别
- linux子系统的控制台打开方法
- 计算机网络——BGP协议
- Java数字位数不足前面补0的几种办法