当将Spring Boot 2.0升级到Spring Boot 2.2时的变化点如下:

首先

以下是将Spring Boot 2.0.2应用程序(约7KB,SPA的服务器部分)迁移到Spring Boot 2.2.5时的修正要点。

春季启动修复部分

“Maven” in Chinese can be translated as “专家” .

我之前使用JUnit5,但在Spring Boot 2.0中,junit-platform-launcher和mockito-junit-jupiter不受spring-boot-starter-parent的管理,而在Spring Boot 2.2中,它们已经受到管理,因此不再需要指定版本。

<dependency>
  <groupId>org.junit.platform</groupId>
  <artifactId>junit-platform-launcher</artifactId>
  <version>1.3.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-junit-jupiter</artifactId>
  <version>2.22.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.junit.platform</groupId>
  <artifactId>junit-platform-launcher</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-junit-jupiter</artifactId>
  <scope>test</scope>
</dependency>

Bean的覆写设置

在Spring Boot 2.0中,如果存在相同的Bean定义,被标记为@Primary的Bean将被优先选择,但在Spring Boot 2.2中,初始化时会抛出BeanDefinitionOverrideException异常。

Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'taskExecutor' defined in mypackage.TestConfiguration: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=true; factoryBeanName=testConfiguration; factoryMethodName=taskExecutor; initMethodName=null; destroyMethodName=(inferred); defined in mypackage.TestConfiguration] for bean 'taskExecutor': There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=mainConfig; factoryMethodName=taskExecutor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [mypackage/MainConfig.class]] bound.

要避免这个问题,请在 application.yml 文件中设置 spring.main.allow-bean-definition-overriding 属性。

spring:
  main:
    allow-bean-definition-overriding: true

更改RestTemplateBuilder的配置值类型。

使用RestTemplateBuilder来配置RestTemplate时,超时设置从毫秒指定变为了java.time.Duration指定,这样单位更加清晰明了。

new RestTemplateBuilder()
    .setConnectTimeout(5000)
    .setReadTimeout(60000);
new RestTemplateBuilder()
    .setConnectTimeout(Duration.ofMillis(5000))
    .setReadTimeout(Duration.ofMillis(60000));

改变了Sort对象的生成方法

Spring Data的 org.springframework.data.domain.Sort 对象的创建方法已经从 new 变为了 by。

new Sort(Sort.Direction.fromString(sortDirection), sortColumn);
Sort.by(Sort.Direction.fromString(sortDirection), sortColumn);

看起来已经移动到了security包下面的servlet包内。

其他

这个本来就是实现不好,但是在JPA的仓库接口方法中有

List<Auth> findByRoleContains(Collection<Role> roles);

有一个定义,我们没有使用过。
当我们将应用程序更改为Spring Boot 2.2并启动时,

Caused by: java.lang.IllegalStateException: Operator CONTAINING on role requires a scalar argument, found interface java.util.Collection in method public abstract java.util.List mypackage.repository.AuthRepository.findByRoleContains(java.util.Collection).

发生了异常。

Contains是用于包含字符串搜索的方法,实际上在这个地方应该使用In,为什么之前没有问题呢?(因为没有使用过,所以没有注意到)

List<Auth> findByRoleIn(Collection<Role> roles);

总结

尽管与从Spring Boot 1.5升级到2.0相比要轻松得多,但由于仍然经常会出现一些细微的破坏性修复,因此仍需注意。

广告
将在 10 秒后关闭
bannerAds