Ich werde die Korrekturpunkte aufschreiben, wenn ich die Anwendung von Spring Boot 2.0.2 (ca. 7 KB, Serverteil von SPA) auf Spring Boot 2.2.5 migriere.
Maven
Ich habe JUnit5 verwendet, aber in Spring Boot 2.0 sind Junit-Platform-Launcher und Mockito-Junit-Jupiter, die nicht unter der Kontrolle von Spring-Boot-Starter-Parent standen, jetzt unter der Kontrolle von Spring Boot 2.2. Die Version muss nicht mehr angegeben werden.
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>
Wenn in Spring Boot 2.0 dieselbe Bean definiert ist, wird die Bean mit "@ Primary" priorisiert. In Spring Boot 2.2 wird bei der Initialisierung eine BeanDefinitionOverrideException-Ausnahme ausgelöst.
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.
Um dies zu vermeiden, legen Sie in application.yml die Eigenschaft spring.main.allow-bean-definition-overriding
fest.
SpringBoot2.0
spring:
main:
allow-bean-definition-overriding: true
Beim Festlegen von RestTemplate mithilfe von RestTemplateBuilder wurde die Zeitlimiteinstellung von der Millisekunden-Spezifikation in die Spezifikation "java.time.Duration" geändert, um das Verständnis des Geräts zu erleichtern.
SpringBoot1.5
new RestTemplateBuilder()
.setConnectTimeout(5000)
.setReadTimeout(60000);
SpringBoot2.0
new RestTemplateBuilder()
.setConnectTimeout(Duration.ofMillis(5000))
.setReadTimeout(Duration.ofMillis(60000));
Die Methode zum Erstellen des Objekts "org.springframework.data.domain.Sort" in Spring Data wurde von "new" in "by" geändert.
SpringBoot1.5
new Sort(Sort.Direction.fromString(sortDirection), sortColumn);
SpringBoot2.0
Sort.by(Sort.Direction.fromString(sortDirection), sortColumn);
Es scheint, dass es in das weitere Servlet-Paket unter dem Sicherheitspaket verschoben wurde.
Dies wurde ursprünglich schlecht implementiert, jedoch in der Methode der JPA-Repository-Schnittstelle
List<Auth> findByRoleContains(Collection<Role> roles);
Ich habe es nicht benutzt. Wenn Sie zu Spring Boot 2.2 wechseln und die App starten,
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).
Ausnahme ist aufgetreten.
Enthält ist eine Suche, die Zeichenfolgen enthält, und ich sollte In anstelle von Enthält verwenden. Warum gab es bisher kein Problem? .. (Ich habe es nicht bemerkt, weil ich es nicht benutzt habe)
List<Auth> findByRoleIn(Collection<Role> roles);
Es war viel einfacher als Als ich von Spring Boot 1.5 auf 2.0 aktualisiert habe, aber es ist immer noch eine zerstörerische Lösung. Seien Sie also vorsichtig. Wird benötigt.