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 ...
随机推荐
- VS2022编译项目出现““csc.exe”已退出,代码为 -1073741819”的错误解决办法
1.问题描述 编译出错如下图所示: 2.解决办法 在NuGet包中输入Microsoft.Net.Compilers,安装该包,安装完后重新生成就不报错了,如下图所示:
- SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
在SQL Server数据库中,统计信息更新(UPDATE STATISTICS)会被其它会话阻塞吗?统计信息更新(UPDATE STATISTICS)会引起其它会话阻塞吗?在回答这两个问题前,我们必 ...
- 本地部署 DeepSeek Janus Pro 文生图大模型
Hello, 大家新年好. 在这个春节期间最火的显然是 DeepSeek 了.据不负责统计朋友圈每天给我推送关于 DeepSeek 的文章超过20篇.打开知乎跟B站也全是 DeepSeek 相关的内容 ...
- Luogu P10869 LCMs 题解 [ 黄 ] [ lcm ] [ 最短路 ]
LCMs:很好的数论和构造题. 显然我们不可以直接建图跑最短路. 于是考虑分讨. 倍数关系 答案显然为 \(\max(a,b)\). 相等关系 答案显然为 \(0\). \(\gcd(a,b)> ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-12- iframe操作-上篇(详细教程)
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- Thymeleaf 嵌套循环
<label th:each="role:${roles}" class="check-box"> <input th:each=" ...
- RP 点归入Set And Coupling 约束创建
想用python脚本创建一个耦合coupling关系,需要定义control piont和被控制的surfaces.两者都可以先分别归入到set 和surface里,最后用set和surface作为c ...
- 【Matlab】判断点和多面体位置关系的两种方法实现
分别是向量判别法(算法来自他人论文).体积判别法(code 是我从网上找的). 方法一: 向量判别法 方法来自一会议论文:<判断点与多面体空间位置关系的一个新算法_石露>2008年,知网. ...
- 【Matlab】输出变量内容到xls文件
版本: matlab 2017a 功能:将矩阵输出一个excel文件 代码: function [ statu ] = write2xls( x,filename,sheet) % 返回值: % 1 ...
- 对接服务升级后仅支持tls1.2,jdk1.7默认使用tls1.0,导致调用失败
背景 如标题所说,我手里维护了一个重要的老项目,使用jdk1.7,里面对接了很多个第三方服务,协议多种多样,其中涉及http/https的,调用方式也是五花八门,比如:commons-httpclie ...