J'écrirai les points de correction lors de la migration de l'application de Spring Boot 2.0.2 (environ 7KL, partie serveur de SPA) vers Spring Boot 2.2.5.
Maven
J'utilisais JUnit5, mais dans Spring Boot 2.0, junit-platform-launcher et mockito-junit-jupiter, qui n'étaient pas sous le contrôle de spring-boot-starter-parent, sont maintenant sous le contrôle de Spring Boot 2.2. Il n'est plus nécessaire de spécifier la version.
SpringBoot2.0
<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>
SpringBoot2.2
<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>
Dans Spring Boot 2.0, lorsque le même bean est défini, le bean avec @ Primary
est prioritaire, mais dans Spring Boot 2.2, une exception BeanDefinitionOverrideException est lancée lors de l'initialisation.
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.
Pour éviter cela, définissez la propriété spring.main.allow-bean-definition-overriding
dans application.yml.
SpringBoot2.0
spring:
main:
allow-bean-definition-overriding: true
Lors de la configuration de RestTemplate à l'aide de RestTemplateBuilder, le paramètre de délai d'expiration est passé de la spécification en millisecondes à la spécification java.time.Duration
, ce qui facilite la compréhension de l'unité.
SpringBoot1.5
new RestTemplateBuilder()
.setConnectTimeout(5000)
.setReadTimeout(60000);
SpringBoot2.0
new RestTemplateBuilder()
.setConnectTimeout(Duration.ofMillis(5000))
.setReadTimeout(Duration.ofMillis(60000));
La méthode de création de l'objet «org.springframework.data.domain.Sort» dans Spring Data est passée de «nouveau» à «par».
SpringBoot1.5
new Sort(Sort.Direction.fromString(sortDirection), sortColumn);
SpringBoot2.0
Sort.by(Sort.Direction.fromString(sortDirection), sortColumn);
Il semble qu'il a été déplacé vers le package de servlet supplémentaire sous le package de sécurité.
Cela a été à l'origine mal implémenté, mais dans la méthode de l'interface de référentiel de JPA
List<Auth> findByRoleContains(Collection<Role> roles);
Je ne l'ai pas utilisé. Si vous passez à Spring Boot 2.2 et démarrez l'application,
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).
Une exception s'est produite.
Contains est une recherche qui inclut des chaînes, et je devrais utiliser In au lieu de Contains. Pourquoi n'y a-t-il eu aucun problème jusqu'à présent? .. (Je ne l'ai pas remarqué parce que je ne l'ai pas utilisé)
List<Auth> findByRoleIn(Collection<Role> roles);
C'était beaucoup plus facile que lorsque j'ai mis à jour Spring Boot 1.5 vers 2.0, mais c'est toujours un peu une solution destructrice, alors soyez prudent. Est requis.
Recommended Posts