spring-boot-devtools 引发的问题

本贴最后更新于 1120 天前,其中的信息可能已经渤澥桑田

问题描述

记录本人使用 spring-boot-dev-tools 在开发环境进行热加载的时候,遇到的问题。

  • 问题 1

在使用 Hutool-All 依赖时调用 ObjectUtil.clone()进行对象深拷贝时发生 java.lang.ClassCastException 问题

java.lang.ClassCastException: com.example.pojo.User cannot be cast to com.example.pojo.User
  • 问题 2

在使用 Mybatis 框架时,多模块项目中,非本项目的依赖中,使用了本项目的 Mapper 接口,在启动时,SpringBoot 无法注入依赖,从而导致项目启动失败

The bean 'userMapper' could not be injected as a 'com.example.mapper.UserMapper' because it is a JDK dynamic proxy that implements:
	com.baomidou.mybatisplus.core.mapper.BaseMapper

解决方式

不使用 spring-dev-devtools

手动添加需要热加载的三方依赖

在项目目中添加一个配置文件 META-INF/spring-devtools.properties 来解决这个问题

# 解决问题1
# hutool-all jar包
restart.include.hutool=/hutool-all-[\\d\\.]+\\.jar
# 解决问题2
# 其他模块jar包
restart.include.other=/other-[\\d\\.].jar

问题产生原因

因为使用 spring-boot-devtools 进行热加载时,仅加载本地代码的所有类,并不会加载任何依赖,且 spring-boot-devtools 加载时会更改 ClassLoader,使用 RestartClasLoader 进行类加载,导致本地代码使用了 RestartClassLoader 加载类,第三方依赖使用了 Launcher$AppClassLoader 加载类,同样的对象在进行类型对比时(如 instanceof Object.class.isInstance())由于 ClassLoader 不同,会判定不一致,从而导致 问题1 的对象拷贝后因类型不一致,又无法转换抛出异常,以及 问题2 的 Mybatis 使用 JDK 动态代理的 Mapper 接口实现类无法注入到依赖 Jar 包中。

问题 2 报错位置断点观察截图

  • 由于 ClassLoader 不同导致判定失败

image.png

参考文章

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.restart.customizing-the-classload

  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 383 关注
  • Hutool
    1 引用 • 3 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 437 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1459 回帖 • 31 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • findwind

    既然是 idea 编辑器

    用 jrebel 插件挺好的,springboot 的热部署经常发生不符合实际用途的问题

    如果是 idea2021.2 之后的版本,用 xrebel 模式启动 debug,不然断点没用

    1 回复
  • 其他回帖
  • xsfs

    我哭了 我翻了好久才查到这个问题。。。-0-

  • tlbcc
    作者

    感谢推荐,JRebel 是个好东西,但是是收费的,在公司用会涉及法律问题,所以没用