
麻了!Spring Boot 从 2.2.5 升级到 2.7.2 之后,一堆BUG
大家好,我是不才陈某~
这篇文章分享一下Spring Boot 升级到2.7的踩坑总结,还是挺全面的,希望对大家有所帮助~
说明
2.7.2为2.x的最后一个稳定版本。
3开始最低要求 Java 17,所以暂时不到3.x。
以下的处理方法主要针对我们的项目,可能并不通用。
1、hibernate-validator包下的类报错
Springboot从2.3以后,spring-boot-starter-web中不再引入hibernate-validator,需要手动引入。
在父pom中引入,已经加入software-center-modules模块中,子模块不需要加:
2、ErrorController无getErrorPath方法
去掉该方法
3、logback和log4j冲突
排除掉springboot的logging
4、循环依赖:The dependencies of some of the beans in the application context form a cycle
WebMainConfig类中 去掉报错的方法和属性handlerAdapter,修改写法
日期转换器,依赖hutool的日期工具类处理,如不满足再自行扩展
代码中应该尽量避免循环依赖的情况,如果出现了,加@Lazy注解,懒加载。
代码中不鼓励依赖循环引用,默认情况下禁止使用循环引用。如果能消除bean之间的依赖循环最好消除,如果实在改动太大,还有一种不推荐的处理方法,设置 spring.main.allow-circular-references=true
5、swagger错误:Failed to start bean 'documentationPluginsBootstrapper'
启动报了“Failed to start bean 'documentationPluginsBootstrapper'”,再往下面看到“springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider”就可以断定是跟Swagger相关的问题。
查资料发现是新版本Spring Boot将Spring MVC默认路径匹配策略由AntPathMatcher更改为PathPatternParser,因此我们可以通过配置让其仍使用AntPathMatcher即可。关注公号:码猿技术专栏,回复关键词:1111,获取阿里内部调优手册
解决方案:在application.properties里配置:
顺便升级swagger到swagger3,已经加到base公共包里了
5.1、修改后路径需要修改,默认首页由swagger-ui.html变成了
5.2、如果还想使用扩展的2个ui的版本也需要跟着升级
我这里直接删除了那2个ui使用了swagger-bootstrap-ui的升级版:knife4j。base模块中已经引入
5.3、swagger的配置类,注解@EnableSwagger2去掉,名字改为更通用的SwaggerConfig
5.4、删除项目中自定义的pringfox.documentation.spring.web.readers包
5.5、去掉自定义的页面,如果想修改找到新的jar包复制出页面进行调整,否则可能看到的页面里没有内容
5.6 调整过滤器路径配置
6、跳转登录页出错
如果出现跳转时出错:
解决方案同5
7、日期转换出错
升级后发现java中是Date类型,数据库中datetime类型(Timestamp类型没有问题)的数据不是转换为Timestamp,而是直接转为LocalDateTime类型了,解决办法:com.ld.shieldsb.dao.MyBeanProcessor修改type2Bean方法,增加LocalDateTime和LocalDate的处理
我们使用的是mysql查看依赖jar包看到mysql-connector-java的版本从8.0.19变成了8.0.29
原因找到com.mysql.cj.jdbc.result.ResultSetImpl类的getObject(int columnIndex)方法可以看到Datetime类型的确实换了类型
8、flyway:org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 5.7
flyway对数据库版本有要求,例如flyway-core的当前版本V8.4.3,不能使用 MySQL 5.7, 当flyway-core 降低到V7.15.0后 问题解决,所以匹配flyway-core和数据库版本后问题即可解决。
9、Junit运行后没有反应
升级后默认使用junit5,而依赖的jar包中引入了junit4的jar包冲突了,去掉junit4的jar包即可。
注意使用junit5后包的名字发生了变化,下面箭头前后分别是junit4和junit5的
10、升级后json中Long类型字段精度丢失
出现如下情况,前面是真实值后面为json传递后的值
原项目中是有Long转字符串的处理的。
问题原因:经查看,默认已经有多个消息转换器了。而 configureMessageConverters 方法中是一个 list 参数。直接向其中添加 HttpMessageConverter 后,默认是排在最后的。就造成了你自定义的消息转换器不生效。其实是被其他转换器接管了。
解决办法:加到第一个就行了。add(0, customConverter())
如果使用的是@bean注解,覆盖的fastjson则不需要改,如下:
文章转载自公众号:码猿技术专栏
