热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot全局异常处理方案分享

这篇文章主要介绍了SpringBoot全局异常处理方案分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

一 业务场景

调用接口时需要对属性进行校验,比如属性长度,当属性为邮箱时校验邮箱格式等,这时候要要用到@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.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 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 midRouteExceptionHandler(HttpServletRequest req, HttpServletResponse res, Exception e) {
    log.error("中台异常", e);
    return new Results<>(false, "99999999", e.getMessage());
}

三 返回案例

到此这篇关于SpringBoot全局异常处理方案分享的文章就介绍到这了,更多相关SpringBoot全局异常处理内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文深入探讨了@RequestBody注解的使用场景及核心逻辑,包括其与@RequestParam的区别和结合使用的方法。文章前半部分介绍了基础知识,后半部分则详细分析了源码和重要结论。 ... [详细]
  • 优化 DropDownList 与 TextBox 的交互体验
    本文介绍了一种解决方案,通过在 DropDownList 前添加一个 TextBox 来提升用户体验。当选项过多时,用户可以通过在 TextBox 中输入关键词来快速定位并选择相应的选项。 ... [详细]
  • 本文详细介绍了如何在Apache Shiro框架中实现对并发登录人数的限制,包括配置和自定义过滤器的具体步骤。 ... [详细]
  • 1整合dubbo1.1e3-manager-Service1.1.1pom.xml排除jar在e3-manager-Service工程中添加dubbo依赖的jar包。 ... [详细]
  • 本文旨在深入探讨ASP.NET MVC框架的基本构成,包括其项目目录结构和关键的DLL文件,帮助开发者更好地理解和利用这一强大的Web开发工具。 ... [详细]
  • 本教程将指导您完成 Spring Boot 应用程序中 MySQL 数据库的配置,并通过 JdbcTemplate 进行基本的数据操作测试。在此之前,我们已经成功打包并测试了 jar 和 war 包,同时实现了 JSP 页面的访问,但页面数据是静态配置的。现在,让我们一起进入数据库配置的世界。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • Spring框架中@Autowired注解对接口与其实现类的绑定机制解析
    本文深入探讨了Spring框架中@Autowired注解的工作原理,特别是当其应用于接口而非实现类时的情况,以及如何处理接口拥有多个实现类的情形。旨在为开发者提供有效的指导。 ... [详细]
  • 本文详细解析了Java面试中常见的问题及答案,旨在帮助求职者更好地准备面试,提高通过率。 ... [详细]
  • 本文详细介绍了 Spring Boot 的启动过程,包括初始化、资源加载、上下文创建及配置加载等关键步骤,帮助开发者深入理解 Spring Boot 的内部机制。 ... [详细]
  • 随着互联网技术的快速发展,前端用户体验和后端服务性能的要求日益提高,促使前后端开发模式向更加专业化的方向发展。本文探讨了前后端分离的原因、实现方式及其优势,旨在通过明确的接口规范和高效的开发流程,提升项目的整体开发效率。 ... [详细]
  • 本文介绍如何利用Spring Boot框架快速搭建一个可立即运行的Hello World应用,通过其约定优于配置的原则,简化Spring应用的开发流程。支持从JDK 6+开始的环境。 ... [详细]
  • 以及在php中同等功能的实现的简单介绍
    以及在php中同等功能的实现的简单介绍 ... [详细]
  • Spring框架中的关键配置文件详解
    本文详细介绍了Spring项目中常见的配置文件,包括pom.xml和spring.xml的作用与使用方法。pom.xml用于管理项目依赖,而spring.xml则负责Bean的定义与初始化。 ... [详细]
  • 本文探讨了在一个多对一关系中保存和删除对象时遇到的问题,并提供了解决方案。具体问题表现为能够成功添加对象,但在尝试删除时,虽然对象从集合中移除,但更改未同步到数据库。 ... [详细]
author-avatar
看是语言_263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有