今天吃饭时,被公司新来的同事问道:“项目controller层里好多都没写try,catch,难道异常不用处理吗?”。虽然正吃饭时被打扰,让我很讨厌,但是既然他诚心诚意的问了,本着爱护(收服)新员工的责任,我还是面带微笑给他讲解了一番:“是这样,异常@#*%*&~...”

  讲完,我爱吃的蒜香烤鱼已经凉了,但是我从同事的眼光中看到了对技术的崇拜和敬仰。哎,程序员就是这么朴实无华,且枯燥~

  

废话讲完,小二,上菜~~

@ControllerAdvice //表示所有被扫描到的controller都有效,相当于给controller中所有的方法写了try
public class ControllerExceptionHandler {
   //日志
private final Logger log = LoggerFactory.getLogger(this.getClass().getName()); /**
* 处理运行时的异常,可优化为自定义异常类
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public ResponseEntity handlerException(RuntimeException ex) {
log.error("发生业务异常!原因是:{}", ex.getMessage());
return ResponseEntity.error(ex.getMessage());
} /**
* 对方法参数校验异常处理方法(仅对于表单提交有效,对于以json格式提交将会失效)
* 如果是表单类型的提交,则spring会采用表单数据的处理类进行处理(进行参数校验错误时会抛出BindException异常)
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public ResponseEntity handlerBindException(BindException ex) {
log.error("valid参数校验异常,提交参数类型form!原因是: {}", ex.getMessage());
return handlerNotValidException(ex);
} /**
* 对方法参数校验异常处理方法(前端提交的方式为json格式出现异常时会被该异常类处理)
* json格式提交时,spring会采用json数据的数据转换器进行处理(进行参数校验时错误是抛出MethodArgumentNotValidException异常)
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResponseEntity handlerArgumentNotValidException(MethodArgumentNotValidException ex) {
log.error("valid参数校验异常,提交参数类型Json!原因是: {}", ex.getMessage());
return handlerNotValidException(ex);
} @ExceptionHandler(Exception.class)
@ResponseBody
public ResponseEntity handlerException2(Exception ex) {
log.error("发生未知异常!原因是: {}", ex.getMessage());
return ResponseEntity.error(ex.getMessage());
} /**
* valid校验,其参数错误异常的统一处理
* @param e
*/
public ResponseEntity handlerNotValidException(Exception e) {
log.debug("begin resolve argument exception");
BindingResult result;
if (e instanceof BindException) {
BindException exception = (BindException) e;
result = exception.getBindingResult();
} else {
MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
result = exception.getBindingResult();
} // Map<String, Object> maps = getStringObjectMap(result);
List<String> list = getStringObjectList(result);
return ResponseEntity.error(list.toString());
} /**
* 这里只返回错误原因(建议)
* 例子:[ID不能为空]
*/
private List<String> getStringObjectList(BindingResult result) {
List<String> list;
if (result.hasErrors()) {
List<FieldError> fieldErrors = result.getFieldErrors();
list = new ArrayList<>(fieldErrors.size());
fieldErrors.forEach(error -> {
list.add(error.getDefaultMessage());
});
} else {
list = Collections.EMPTY_LIST;
}
return list;
} /**
* 这里是返回:字段名=错误原因(不建议)
*/
private Map<String, Object> getStringObjectMap(BindingResult result) {
Map<String, Object> maps;
if (result.hasErrors()) {
List<FieldError> fieldErrors = result.getFieldErrors();
maps = new HashMap<>(fieldErrors.size());
fieldErrors.forEach(error -> {
maps.put(error.getField(), error.getDefaultMessage());
});
} else {
maps = Collections.EMPTY_MAP;
}
return maps;
}
}

  

  我个人比较喜欢使用@Valid注解来校验数据,所以这里全局处理了其相关的异常。对于编写全局异常,非常考验程序员对于java异常的理解和运用。异常哪个地方抛,是谁抛,抛给谁,谁处理,这些都是难点,但是如果能吃透,基本上是个合格的程序员了。期望你能扶摇直上九万里~

java开发中简简单单的全局异常处理的更多相关文章

  1. Java开发中的eclispe常用快捷键&全部快捷键

    Java开发中的eclispe常用快捷键&全部快捷键 Ctrl+1 快速修复(经典快捷键)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ ...

  2. paip.java 开发中web server的选择jboss resin tomcat比较..

    paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...

  3. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  4. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...

  5. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  6. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  7. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  8. 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]

    完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...

  9. Java 开发中的对象拷贝

    前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...

  10. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

随机推荐

  1. biancheng-Spring MVC

    MVC设计模式简介 http://c.biancheng.net/spring_mvc/ MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Control ...

  2. mxGraph绘制机构图

    简单介绍一下使用的依赖: JGraphX package   JGraphX is a Java Swing diagramming (graph visualisation) library lic ...

  3. The Communication Complexity of Threshold Private Set Intersection-2019:解读

    记录阅读论文的笔记. 什么是阈值PSI? Alice和Bob当两者的交集大小不小于\(n-t\)时(两者的不同元素的数量不大于阈值\(2t\)时),才会求交集. 所以阈值PSI会分为两步: 1.检测 ...

  4. 配置计算节点之间的SSH

    本文分享自天翼云开发者社区<配置计算节点之间的SSH>,作者:y****n 如果在管理程序之间调整或迁移实例,可能会遇到SSH(拒绝权限)错误.请确保每个节点都配置了SSH密钥验证,以便C ...

  5. 谈谈天翼云VPCE

    本文分享自天翼云开发者社区<谈谈天翼云VPCE>,作者:天枫霁月 一.VPCE产品出现的背景 跨VPC通信,且能够严格限制访问,任意两个租户之间都能互通,性能高,花费少,通过VPCE产品实 ...

  6. ECharts中实现x轴中的坐标以不同间距显示的效果

    1.需求描述 我们日常在使用ECharts实现曲线图或柱状图的时候,x轴上的坐标都是等距离显示的. 有时候我们可能有这个需求: x轴上的坐标距离按照对应数据的比例进行显示. 打个比方,假设x轴上有5个 ...

  7. Jenkins+Ant+JaCoCo的代码覆盖率集成实践

    Jenkins+Ant+JaCoCo的代码覆盖率集成实践 一.工具介绍 Jenkins: Jenkins是一个开源的.基于Java开发的持续集成工具,它可以帮助开发人员自动化构建.测试和部署软件项目. ...

  8. Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]

    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题. 贪心 破环成链的 trick 自然不用多说. 首先观察题目,很容易发现一个性质:只走一圈的方案一定最优.这个很容易证,因为再绕一圈回来标记前 ...

  9. [BZOJ3037] 创世纪 题解

    基环内向树上 dp,不过在这里提供给一种非典型做法. 考虑将环上的每一条边都断开,这样就会形成多棵树,先在这些树上进行树形 \(dp\).设 \(dp_{i,0/1}\) 表示不选/选 \(i\) 时 ...

  10. autohue.js:让你的图片和背景融为一体,绝了!

    需求 先来看这样一个场景,拿一个网站举例 这里有一个常见的网站 banner 图容器,大小为为 1910*560 ,看起来背景图完美的充满了宽度,但是图片原始大小时,却是: 它的宽度只有 1440 , ...