当前位置:   article > 正文

springBoot2 升级springBoot3问题记录_sptingboot项目升级springboot3

sptingboot项目升级springboot3

springBoot3官方升级文档 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide

springBoot2项目升级springBoot3记录,springBoot3支持最低JDK版本为17,所以升级时必须同步升级JDK版本。

1 jakarta代替javax

这个官方资料里有提到,是sbt3的一个重要变化,内嵌的tomcat不再支持javax.servlet以及其他javax相关包,比如javax.annotation,现在必须换用jakarta系列规范与API了,比如jakarta.servlet与jakarta.annotation。
2017年,Oracle宣布将Java EE捐赠给Eclipse基金会,但不再允许其使用Java商标,于是社区投票后将Java EE改名为Jakarta EE。随后大家开始慢慢将javax系列包改为使用Jakarta系列的包。而到了sbt3,spring终于宣布不再支持使用老旧的javax的相关包。这意味着你不但要重构自己的java工程中对javax的使用,也要升级很多第三方提供的jar的版本。不过目前这个工作应该差不多都做过了。
这个变动看着可怕,其实对应很简单,我个人只做了以下几件事:

根据spring官方文档以及spring-boot-starter-parent的最新版本,确定各个第三方jar的较新兼容版本,如果你一直直接使用spring-boot-starter-parent作为你的sbt工程的Parent工程,那么这一步很简单,只需要注意自己显式写了版本号的jar依赖即可。如果你和我一样有自己的Parent工程,那么就需要参照官方文档和使用spring-boot-starter-parent的demo中的版本号来修改自己的Parent工程中的各个依赖包的版本号了。
使用jakarta.servlet与jakarta.annotation代替javax的对应包

jakarta.servlet
jakarta.servlet-api


jakarta.annotation
jakarta.annotation-api

使用idea提供的重构功能将javax包名改为jakarta。可以直接使用idea的菜单Refactor -> Migrate Packages and Classes -> Java EE To Jakarta EE即可。

2 spring.favtories文件废弃

如果你有自己写的springboot-starter,那么你一定用/META-INF/spring.favtories文件定义过发现自动配置。
但是在sbt2.7时,这个文件被弃用了,但还没有移除这个功能,在sbt3中,它被移除了。
比如以前我们需要定义/META-INF/spring.favtories文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
x.x.x.x.x.x,
x.x.x.x.x

那么现在你得改成/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:
x.x.x.x.x.x
x.x.x.x.x

3 log4j2版本

如果你对应过2021年12月影响巨大的log4j2安全漏洞问题,那么你可能固定使用了log4j2的2.17.x版本,这个版本在sbt3中不兼容,sbt3使用的是2.19.0版本。
放心,新版本目前没有发现安全漏洞。
你可以直接去掉自己之前对log4j版本的固定,或者手动改为2.19.0,都可以。

4 slf4j版本

log4j-slf4j-impl版本升级到2.19.0后,slf4j-api的版本默认会变为2.0.x,此时运行以前的junit,如果包含slf4j的log,那么会抛出错误:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/home/maven_repo/org/apache/logging/log4j/log4j-slf4j-impl/2.19.0/log4j-slf4j-impl-2.19.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
slf4j-api版本显式声明为1.7.36即可解决问题, 或者引入log4j-slf4j2-impl版本

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

55 ldap默认健康检查

如果你的工程使用了spring-boot-starter-data-ldap,那么现在它会在启动时自动触发ldap的健康检查,如果你想关闭它,在application配置中添加以下属性即可:

management:
health:
ldap:
# ldap健康检查开关,默认开启, 这里关闭
enabled: false

6 RestTemplate默认httpclient变动

RestTemplate底层默认使用的http客户端不再是apache的httpclient了,换成了jdk自己的,从而带来一个好处:
以前想用RestTemplate访问https服务,需要自己定义sslContext信任指定证书或所有证书,并自定义一个http客户端来代替RestTemplate的默认http客户端。
但现在不需要了,直接new RestTemplate()即可访问https服务。
我不确定new RestTemplate()可以直接访问https服务这个特性是不是从sbt3开始的,但是sbt3的restTemplate已经不再支持apache的httpclient4版本了,改为支持apache的httpclient5,但apache的httpclient5和httpclient4并不兼容,因此之前基于httpclient4自定义的ssl与http客户端相关代码编译不过了。然后我在研究怎么用apache的httpclient5来定义支持ssl的http客户端时突然发现,可以直接用new RestTemplate()访问https服务了。

7 swaggerUI界面访问失败问题

原来的swagger-ui依赖坐标替换为以下坐标
webMvc工程使用
请添加图片描述
webFlux工程使用
请添加图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/704159
推荐阅读
相关标签
  

闽ICP备14008679号