SpringBoot接口 - 统一异常处理
为什么要统一异常处理
如果不统一处理异常,程序开发时就需要在controller层写大量重复的Valid代码, 比如下面这个样子:
@Slf4j
@RestController
public class Controller {
/**
*
* @param ListReq
* @return
* @throws Exception
*/
@RequestMapping("/list")
public ResponseMessage getList(@Valid @RequestBody ListReq listReq, BindingResult bindingResult) throws Exception {
log.info("start /list,请求参数:{}", JSONObject.toJSONString(listReq));
//参数校验
if (bindingResult.hasErrors()) {
bindingResult.getAllErrors().forEach(objectError -> log.warn("[{}]绑定校验错误[{}]", objectError.getCodes()[0], objectError.getDefaultMessage()));
return ResponseUtil.setFailedResponse(ResponseStatus.PARAM_FAILED);
}
// 参数预处理
try {
// do something
} catch(Exception e) {
return ResponseUtil.setFailedResponse(ResponseStatus.PARAM_FAILED);
}
return ResponseUtil.setSuccessResponse(ResponseStatus.SUCCESS);
}
如上所示,每个接口都会进行重复的参数校验、预处理,最终项目中充斥大量的重复代码,臃肿;那么接下来我们学习使用java提供的@ControllerAdvice统一异常处理简化我们的代码。
@ControllerAdvice异常统一处理
先看代码实现:
异常处理
/**
* 统一处理异常信息
*/
@Slf4j
@RestControllerAdvice
public class ExceptionAdvice {
/**
* 捕获接口请求参数校验异常
*/
@ResponseBody
@ExceptionHandler(value = {BindException.class, ValidationException.class,
MethodArgumentNotValidException.class, MissingServletRequestParameterException.class})
public ResponseMessage handleParameterVerificationException(@NonNull Exception e) {
if (e instanceof MethodArgumentNotValidException) {
//MethodArgumentNotValidException异常:@RequestBody上validate失败后抛出的异常,json格式有效
BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
bindingResult.getAllErrors().forEach(
objectError -> log.warn("[{}]绑定校验错误[{}]", objectError.getCodes()[0], objectError.getDefaultMessage()));
} else if (e instanceof BindException) {
//BindException异常:@RequestBody上validate失败后抛出的异常,表单提交有效
BindingResult bindingResult = ((BindException) e).getBindingResult();
bindingResult.getAllErrors().forEach(
objectError -> log.warn("[{}]绑定校验错误[{}]", objectError.getCodes()[0], objectError.getDefaultMessage()));
} else {
//@RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException异常
//@RequestParam上参数缺失抛出MissingServletRequestParameterException异常
log.warn("绑定校验错误[{}] ", e.getMessage());
}
return ResponseUtil.setFailedResponse(ResponseStatus.PARAM_FAILED);
}
/**
* 捕获其他Exception
*/
@ResponseBody
@ExceptionHandler({Exception.class})
public ResponseMessage customExceptionHandler(Exception e) {
log.error(e.getMessage());
return ResponseUtil.setFailedResponse(ResponseStatus.FAILED);
}
}
接口层(无需特殊处理)
@Slf4j
@Validated
@RestController
public class Controller {
/**
* @param listReq
* @return
* @throws Exception
*/
@RequestMapping("/list")
public ResponseMessage getList(@Valid @RequestBody ListReq listReq) throws Exception {
log.info("start /list,请求参数:{}", JSONObject.toJSONString(listReq));
return confMgmtService.getConfList(confListReq);
}
以上就是统一处理的简单实现~ 快GET起来吧
SpringBoot接口 - 统一异常处理的更多相关文章
- Springboot项目统一异常处理
Springboot项目统一异常处理 一.接口返回值封装 1. 定义Result对象,作为通用返回结果封装 2. 定义CodeMsg对象,作为通用状态码和消息封装 二.定义全局异常类 三.定义异常处理 ...
- SpringBoot之统一异常处理
异常,不仅仅是程序运行状态的描述,还可以使得代码编写更加的规范 1.自定义异常:FieldValueInvalidException package com.geniuses.sewage_zer ...
- springboot返回统一接口与统一异常处理
springboot返回统一接口与统一异常处理 编写人员:yls 编写时间:2019-9-19 0001-springboot返回统一接口与统一异常处理 简介 创建统一的返回格式 Result 封装统 ...
- SpringBoot接口 - 如何优雅的写Controller并统一异常处理?
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...
- 配置springboot在访问404时自定义返回结果以及统一异常处理
在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...
- SpringBoot小技巧:统一异常处理
SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...
- springboot中web应用的统一异常处理
在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...
- SpringBoot统一异常处理后TX-LCN分布式事务无法捕获异常进行回滚
通常我们使用SpringBoot都会进行统一异常处理,例如写一个BaseController,在BaseController里进行统一异常处理,然后其他的Controller都继承BaseContro ...
- SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...
- SpringBoot系列——自定义统一异常处理
前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...
随机推荐
- JVM虚拟机中的内存区域
- JMeter中使用嵌套变量方法
JMeter中使用嵌套变量方法 在使用JMeter进行接口测试时,经常遇到需要动态生成变量名并引用其值的情况.在JMeter中,嵌套变量的使用可以帮助我们实现这一目标.本文将详细介绍如何在JMeter ...
- Django项目实战:创建和迁移数据库
Django项目实战:创建和迁移数据库 一.配置数据库 Django默认使用SQLite数据库,但你也可以选择其他数据库如MySQL.PostgreSQL等.在./settings.py文件中,你可以 ...
- 并发编程 - 线程同步(五)之原子操作Interlocked详解二
上一章我们学习了原子操作Interlocked类的几个常用方法,今天我们将继续学习该类的其他方法. 01.Exchange方法 该方法用于原子的将变量的值设置为新值,并返回变量的原始值.该方法共有14 ...
- shell 数组函数进阶练习
一维数组的定义.统计.引用和删除等操作. A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义, 数组的值可以随机定义. echo ${A[0]} ,代表引用第一个数组变量 ...
- FreeSql学习笔记——9.延时加载
前言 使用过EF都知道延时加载,延时加载即需要用到数据的时候才去数据库读取数据,这样做的好处是只有诗句真正被用到的时候才会执行sql语句读取数据库数据,避免了加载不去要的数据,同时也提升了数据度的 ...
- 解锁 DeepSeek 的高效秘籍:技术人员的进阶技巧
DeepSeek 作为一款强大的代码搜索引擎,能够帮助开发者快速定位代码.解决疑难问题,甚至学习前沿技术.但想要真正释放其潜力,必须掌握以下核心技巧.本文将通过重点标注,直击高效使用 DeepSeek ...
- 多项式算法再探:FMT 和 FWT
我们知道,FFT 和 NTT 可以用来解决下面这种问题: \[c_k=\sum_{i+j=k}a_ib_j \] 不过,这并不是卷积的全部形态,比如下面这种: \[c_k=\sum_{i*j=k}a_ ...
- nginx: [error] open() “/usr/local/var/run/nginx.pid” failed (2: No such file or directory)
- c#securityexception不允许所请求的注册表访问权
开机自启动程序如下: if (!System.IO.File.Exists(filename)) throw new Exception("该文件不存在 ...