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)是一套被反复使用.多数人知晓的.经过分类 ...
随机推荐
- a链接被点击后,在跳转之前的处理事件
在HTML中,<a> 标签通常用于创建链接,使用户能够点击并跳转到另一个页面或网址.如果你想在跳转前处理一些事件,你可以使用JavaScript来实现这一功能. 以下是一个简单的示例,展示 ...
- ADC温敏电阻测温
一.ADC采样电路 使用热敏电阻与连续逼近型寄存器 (SAR) 模数转换器 (ADC) 直接监测温度的电路.温度检测电路使用负温度系数 (NTC) 热敏电阻与电阻串联构成分压器. 参考电压:VCC 分 ...
- Python pika消费Rabbit MQ数据,慢消费引起的connection reset问题
问题描述 使用python pika框架,从Rabbit MQ消费数据时,遇到了connection reset的错误,错误内容如下: Traceback (most recent call last ...
- Windows安装MySql时出现“Failed to find valid data directory”的错误
1.问题描述 具体错误信息如下所示: 2021-08-13T06:18:24.942954Z 0 [System] [MY-010116] [Server] D:\Net_Program\Net_My ...
- Git 忽略文件配置全解析
Git 忽略文件配置全解析 在Git版本控制系统中,.gitignore文件扮演着至关重要的角色.它允许我们指定哪些文件或目录应该被Git忽略,即不被纳入版本控制之中.这对于避免提交敏感信息.构建产物 ...
- 问一下,利用在线 DeepSeek 等 API 服务实现一个答题 APP
简介 这是一个利用 Android 无障碍功能 + 悬浮窗 + 大模型的搜题应用 原理就是利用无障碍读取屏幕内容,然后通过悬浮窗来显示答案 众所周知我是一个学渣,所以在搜答案方面颇有成就 大概是在 4 ...
- FLink参数pipeline.operator-chaining介绍
1.当使用flink提交一个任务,没有给算子设置并行度情况下,默认所有算子会chain在一起,整个DAG图只会显示一个算子,虽然有利于数据传输,提高程序性能,但是无法看到数据的输入和疏忽,业绩反压相关 ...
- 微信扫码登录授权过程中state字段的用法
问题描述 最近在实现微信扫码登录这一块,然后看到state字段上面说是可以防csrf攻击 那么现在假设一个用户扫完码后由于某些原因扫码后的响应还没到,但是该平台的回调url已被窃取,然后被人设置到某个 ...
- JUC并发—10.锁优化与锁故障
大纲 1.标志位修改场景优先使用volatile(服务优雅停机) 2.数值递增场景优先使用Atomic类(心跳计数器) 3.共享变量仅对当前线程可见的场景优先使用ThreadLocal(edits l ...
- DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
DeepSeek 新的 LLM 推理方法 DeepSeek 通过强化学习(RL)提出了一种创新的改进大规模语言模型(LLM)推理能力的方法,这在他们最近关于 DeepSeek-R1 的论文中有详细介绍 ...