SpringBoot全局异常处理方案分享


Posted in Java/Android onMay 25, 2022

一 业务场景

调用接口时需要对属性进行校验,比如属性长度,当属性为邮箱时校验邮箱格式等,这时候要要用到@Validated注解,在使用这个注解后发现出现了一个问题,调用接口后并没有返回我们想要的报错结果,而是返回了 "message": "Validation failed for object='IMMessageSend'. Error count: 1",显然这不是我们想要的结果,查看控制台打印,发现如下输出:

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Line:199 - Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.dst.mid.common.entities.result.Results<com.dst.message.core.common.model.IMMessageResponse> com.dst.message.core.modules.business.open.sendmessage.controller.IMMessageController.sendMessage(com.dst.message.core.common.model.IMMessageSend): [Field error in object 'IMMessageSend' on field 'msg': rejected value [901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789]; codes [Length.IMMessageSend.msg,Length.msg,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [IMMessageSend.msg,msg]; arguments []; default message [msg],5,0]; default message [消息长度不能大于500个字符]] ]

原因是异常拦截字符串太长,这时候我们需要定义全局异常处理,来多系统抛出的异常进行拦截处理

二 全局系统异常类

一)全局系统异常类

@Data
public class IMMessageSend {
   /**
    * 发送消息信息
   */
   @Length(max = 500,message = "消息长度不能大于500个字符")
   private String msg;
   /**
    * 接收用户id集合
   */
   private List<String> receiveUserIds;
   /**
    * 发送用户id
   */
   private String sendUserId;
}
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerConfig {
![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/210abf8f82204ea18c9af123dcb4a7f3~tplv-k3u1fbpfcp-watermark.image?)
   
    /**
     * 自定义验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        return new Results<>(false, "99999999",  e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining("\n")));
    }
}
  • @RestControllerAdvice与@ExceptionHandler搭配使用可以对异常进行拦截
  • e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage)对异常进行拦截并遍历
  • 返回异常

二) 包装异常返回结果给前端,修改自定义异常

新建一个自定义异常:

public class MidRouteException extends RuntimeException {
    private static final String ERROR_MESSAGE_FORMAT = "执行路由流程异常:%s";
    public MidRouteException(String error) {
        super(String.format(ERROR_MESSAGE_FORMAT, error));
    }
}

在断言中使用自定义异常:

public class MidAssert {
    /**
     * 断言 执行异常
     *
     * @param isTrue  判断标识
     * @param message 异常信息
     */
    public static void isTrueWithSqlException(boolean isTrue, String message) {
        if (!isTrue) {
            throw new MidRouteException(message);
        }
    }

在全局异常处理中对异常进行操作:

/**
 * 拦截MidSqlException MidSqlFrameException  MidRouteException MidRouteFrameException异常
 */
@ExceptionHandler({MidSqlException.class, MidSqlFrameException.class, MidRouteException.class, MidRouteFrameException.class})
public Results<String> midRouteExceptionHandler(HttpServletRequest req, HttpServletResponse res, Exception e) {
    log.error("中台异常", e);
    return new Results<>(false, "99999999", e.getMessage());
}

三 返回案例

SpringBoot全局异常处理方案分享

到此这篇关于SpringBoot全局异常处理方案分享的文章就介绍到这了!


Tags in this post...

Java/Android 相关文章推荐
SpringCloud Alibaba 基本开发框架搭建过程
Jun 13 Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
java调用Restful接口的三种方法
Aug 23 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Java 多线程协作作业之信号同步
May 11 Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 Java/Android
SpringBoot详解自定义Stater的应用
Jul 15 Java/Android
Java数据结构之堆(优先队列)
May 20 #Java/Android
Java中Dijkstra(迪杰斯特拉)算法
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 #Java/Android
springcloud整合seata
springboot读取nacos配置文件
May 20 #Java/Android
Android studio 简单计算器的编写
May 20 #Java/Android
mybatis 获取更新记录的id
May 20 #Java/Android
You might like
PHP 高手之路(二)
2006/10/09 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
php计算函数执行时间的方法
2015/03/20 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python操作MySQL简单实现方法
2015/01/26 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
一些Solaris面试题
2013/03/22 面试题
制定岗位职责的原则
2013/11/08 职场文书
后勤工作职责
2013/12/22 职场文书
承诺书格式范文
2014/06/03 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
工作表扬信
2015/01/17 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
公司仓库管理制度
2015/08/04 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书