当将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相比要轻松得多,但由于仍然经常会出现一些细微的破坏性修复,因此仍需注意。