java开发中简简单单的全局异常处理
今天吃饭时,被公司新来的同事问道:“项目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开发中简简单单的全局异常处理的更多相关文章
- Java开发中的eclispe常用快捷键&全部快捷键
Java开发中的eclispe常用快捷键&全部快捷键 Ctrl+1 快速修复(经典快捷键)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ ...
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...
- Java 开发中的对象拷贝
前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
随机推荐
- C# 单例简单实例
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Li ...
- 国际“论”剑!天翼云数据库论文被EDBT收录!
近日,由天翼云数据库团队.中国电信云计算研究院和深圳北理莫斯科大学合作完成的<Taste: Towards Practical Deep Learning-based Approaches fo ...
- Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [ BFS ]
Paper-cutting:思维很好,但代码很构式的 manacher 题. 蒟蒻 2025 年切的第一道题,是个紫,并且基本独立想出的,特此纪念. 判断能否折叠 我们先考虑一部分能折叠需要满足什么条 ...
- LangChain基础篇 (05)
LangChain 核心模块:Data Conneciton - Document Transformers 一旦加载了文档,通常会希望对其进行转换以更好地适应您的应用程序. 最简单的例子是,您可能希 ...
- initiator 连接target
客户端 检查是否发现 [root@kvm1 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.114.14 1 ...
- flutter-原生路由传自定义对象
自定义对象 1 class Dk { 2 int id; 3 String title; 4 String address; 5 String ww; 6 String account; 7 } 传值 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)
1.问题描述: 客户端创建实况窗后,通过Push kit更新实况窗内容,这个过程是自动更新的还是客户端解析push消息数据后填充数据更新?客户端除了接入Push kit和创建实况窗还需要做什么工作? ...
- VSCode 如何选中包含某个字母的所有行
- QT5笔记:7. 自定义类、自定义信号及类的元对象信息
自定义的QPerson类,需要继承 QObject类 qperson.h头文件 #ifndef QPERSON_H #define QPERSON_H #include <QObject> ...
- 《uTools:提升效率的神奇工具》
utools5.0 一.引言 在如今快节奏的工作和生活中,我们都在寻找能够帮助我们节省时间.提高效率的工具.uTools 就是这样一款令人惊艳的工具,它为我的日常带来了极大的便利. 相关链接:uToo ...