为什么要统一异常处理

如果不统一处理异常,程序开发时就需要在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接口 - 统一异常处理的更多相关文章

  1. Springboot项目统一异常处理

    Springboot项目统一异常处理 一.接口返回值封装 1. 定义Result对象,作为通用返回结果封装 2. 定义CodeMsg对象,作为通用状态码和消息封装 二.定义全局异常类 三.定义异常处理 ...

  2. SpringBoot之统一异常处理

    异常,不仅仅是程序运行状态的描述,还可以使得代码编写更加的规范   1.自定义异常:FieldValueInvalidException package com.geniuses.sewage_zer ...

  3. springboot返回统一接口与统一异常处理

    springboot返回统一接口与统一异常处理 编写人员:yls 编写时间:2019-9-19 0001-springboot返回统一接口与统一异常处理 简介 创建统一的返回格式 Result 封装统 ...

  4. SpringBoot接口 - 如何优雅的写Controller并统一异常处理?

    SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...

  5. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  6. SpringBoot小技巧:统一异常处理

    SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...

  7. springboot中web应用的统一异常处理

    在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...

  8. SpringBoot统一异常处理后TX-LCN分布式事务无法捕获异常进行回滚

    通常我们使用SpringBoot都会进行统一异常处理,例如写一个BaseController,在BaseController里进行统一异常处理,然后其他的Controller都继承BaseContro ...

  9. SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

    SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...

  10. SpringBoot系列——自定义统一异常处理

    前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...

随机推荐

  1. react事件 报错Cannot read property 'setState' of undefined

    import React, { Component } from "react"; export class TestHanderClick extends Component { ...

  2. NAT原理:概念、使用场景、转发流程及规则

    本文分享自天翼云开发者社区<NAT原理:概念.使用场景.转发流程及规则>,作者:x****n 网络地址转换(NAT)是一种在计算机网络中将一个网络的IP地址转换为另一个网络的IP地址的技术 ...

  3. 开源的 DeepSeek-R1「GitHub 热点速览」

    春节假期回来,一睁眼全是王炸级的开源模型 DeepSeek-R1! GitHub 地址→github.com/deepseek-ai/DeepSeek-R1 DeepSeek-R1 开源还不到一个月, ...

  4. 2023LN省选游记

    前言 CSP第一轮都考完了,我才写这个游记.我真懒惰 书接上回 正文 Day -114514 我也没想到我居然能报省选. 报上了.准备去爆零. Day -114513~Day -1 学习暴力算法以及痛 ...

  5. Spring单元测试(一)入门与实践

    问题:如何快速测试,而不是每次测试都要重启应用? 目标:尽量只测试局部代码 不同的测试 软件工程中分为:单元测试.集成测试.功能测试.系统测试.其中功能测试和系统测试一般是测试人员的责任,但单元测试和 ...

  6. 发那科FANUC机器人M-710iC减速机维修看这几步

     发那科作为全球知名的工业机器人制造商,其M-710iC型号机器人在工业界享有盛誉.然而,即便是最顶尖的设备也难免会遇到维修问题,其中四轴传动齿轮箱的维修尤为关键.本文将深入探讨发那科FANUC机器人 ...

  7. 使用Windows系统自带DLL修复工具修复系统缺失dll的问题

    1. System File Checker(SFC) System File Checker(SFC)是Windows自带的一个工具,可以扫描系统文件并尝试修复任何受损的文件.要使用SFC,请按照以 ...

  8. 【Python】将网格数据写入到VTK文件

    1. vtk 文件格式 根据官网进行总结 vtk文件组成:5个部分. 第一部分,第一行:表明文件版本.写"# vtk DataFile Version 2.0"就行 第二部分,第二 ...

  9. ChatBI≠NL2SQL:关于问数,聊聊我踩过的坑和一点感悟

    "如果说数据是新时代的石油,智能问数就是能让普通人也能操作的智能钻井平台." 这里是**AI粉嫩特攻队!** ,这段时间真的太忙了,不过放心,关于从零打造AI工具的coze实操下篇 ...

  10. laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.

    可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...