Ich werde die Korrekturpunkte schreiben, wenn ich die Spring Boot 1.5-Anwendung (ca. 7 KB, SPA-Serverteil) auf Spring Boot 2.0 migriere. Es waren eine ganze Reihe von Änderungen erforderlich, z. B. das Ändern von Klassenpaketen und das Veralten.
Anfangs wollte ich Spring Boot nicht auf 2.0 setzen, ich wollte nur auf Elasticsearch 6 zugreifen, aber um auf Elasticsearch 6 zugreifen zu können, muss ich Spring-Boot-Starter-Data-Elasticsearch auf 2.0 Einheiten erhöhen. Ich hatte keine andere Wahl, als Spring Boot selbst auf 2.0 zu erhöhen.
Maven
Die diesmal migrierte Anwendung hängt von den folgenden Bibliotheken ab.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core-tiger</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
Ursprünglich verwendete ich Spring IO-Plattform, aber EOL ist September 2019 und "Spring-Boot-Starter-Parent" Es wird empfohlen, es zu verwenden oder die Spring-Boot-Abhängigkeiten zu importieren. " Der Empfehlung folgend habe ich beschlossen, von der Spring IO-Plattform zum Spring-Boot-Starter-Parent zu wechseln.
SpringBoot1.5
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Brussels-SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
SpringBoot2.0
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
Die Kontextpfadhierarchie hat sich geändert. Es scheint so zu funktionieren, wie es ist, aber es ist sicherer, es zu ändern.
SpringBoot1.5
server:
context-path: /sample
SpringBoot2.0
server:
servlet:
context-path: /sample
Da Spring Boot 2.0 Java 8-kompatibel ist, ist die Adapterklasse, die die Schnittstelle leer implementiert, veraltet und stattdessen wurde die Standardimplementierung der Methode zur Schnittstelle selbst hinzugefügt. Daher besteht die Änderung darin, die Schnittstelle direkt zu implementieren, anstatt den Adapter zu erweitern.
SpringBoot1.5
public class WebMvcConfig extends WebMvcConfigurerAdapter {
SpringBoot2.0
public class WebMvcConfig implements WebMvcConfigurer {
Ich habe SecurityAutoConfiguration, eine automatische Sicherheitskonfiguration, ausgeschlossen, um die Sicherheitseinstellungen je nach Profil zu ändern. Dieses SecurityAutoConfiguration-Paket wurde jedoch geändert.
SpringBoot1.5
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
SpringBoot2.0
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
Es scheint, dass es in das weitere Servlet-Paket unter dem Sicherheitspaket verschoben wurde.
Ich habe ShaPasswordEncoder für den internen Cache verwendet, aber die Klasse selbst ist weg. Die Klassenstruktur für PasswordEncoder wurde überprüft. Außerdem sind die ShaPasswordEncoder-Klasse und die Md5PasswordEncoder-Klasse, die anfällige Algorithmen verwendet haben, verschwunden (der Algorithmus selbst scheint zu bleiben, ist aber [veraltet]) (https: //info.michael-simons). eu / 2018/01/13 / spring-security-5-new-password-storage-format /)).
Ab Spring Boot 2.0 wird PasswordEncoder mit PasswordEncoderFactories generiert.
SpringBoot1.5
MessageDigestPasswordEncoder encoder = new ShaPasswordEncoder(256);
return encoder.encodePassword(password);
SpringBoot2.0
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
return encoder.encode(password);
Die Methode wurde auch von encodePassword () in encode () geändert.
Der schwierigste Teil dieses Fixes war dies (weil es so viele gab ...). Die findOne () -Methode von CrudRepository wurde in findById () umbenannt, und der Rückgabewert ist jetzt ein optionaler Typ anstelle eines Entitätstyps.
SpringBoot1.5
Employee employee = employeeRepository.findOne(employeeId);
SpringBoot2.0
Optional<Employee> employee = employeeRepository.findById(employeeId);
PageRequest new ist veraltet. Verwenden Sie stattdessen ().
SpringBoot1.5
employeeRepository.findAll(specifications,
new PageRequest(page, size, new Sort(
Sort.Direction.fromString(sortDirection), sortColumn)));
SpringBoot2.0
employeeRepository.findAll(specifications,
PageRequest.of(page, size, new Sort(
Sort.Direction.fromString(sortDirection), sortColumn)));
Wenn Sie PageRequest in of () ändern, sollten Sie Sort in of () ändern, um den Stil zu vereinheitlichen.
SpringBoot2.0
employeeRepository.findAll(specifications,
PageRequest.of(page, size, Sort.of(
Sort.Direction.fromString(sortDirection), sortColumn)));
Mit Java 8 und dem Hinzufügen einer Standardimplementierung zur Spezifikationsschnittstelle ist die direkte Verwendung der Specifications-Klasse, die die Specification-Schnittstelle implementiert, veraltet. (Obwohl die Standardimplementierung der Spezifikationsschnittstelle die Spezifikationsklasse verwendet.)
SpringBoot1.5
employeeRepository.findAll(
Specifications.where((root, query, cb) -> cb.equal(property, value)));
SpringBoot2.0
employeeRepository.findAll(
Specification.where((root, query, cb) -> cb.equal(property, value)));
Es gab auch eine Änderung, da die Hibernate-Version mit Spring Boot 2.0 auf 5.2.17 aktualisiert wurde.
Ich habe die ExplicitParameterInfo-Klasse verwendet, als ich NULL mithilfe von NativeQuery von Hibernate explizit angeben wollte, aber das Paket dieser Klasse reicht von "org.hibernate.jpa.criteria.compile.ExplicitParameterInfo" bis "org.hibernate.query" Geändert zu .criteria.internal.compile.ExplicitParameterInfo`.
** 12.07.2018 Nachtrag / Update **
Im Fall von PostgreSQL 10 kann zumindest ExplicitParameterInfo nicht mehr angegeben werden, wenn NULL angegeben wird.
Wenn ich ExplicitParameterInfo verwende, erhalte ich eine Fehlermeldung wie " org.postgresql.util.PSQLException: ERROR: Operator existiert nicht: text = by tea
".
Wenn Sie daher einen NULL-Typ angeben möchten, verwenden Sie TypedParameterValue anstelle von ExplicitParameterInfo.
SpringBoot1.5
import org.hibernate.jpa.criteria.compile.ExplicitParameterInfo;
//Unterlassung
Query query = entityManager.createNativeQuery(query);
query.setParameter(new ExplicitParameterInfo<>("employeeName", null, String.class), null);
List<Employee> employeeList = query.getResultList();
SpringBoot2.0
import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.type.StringType;
//Unterlassung
Query query = entityManager.createNativeQuery(query);
query.setParameter("employeeName", new TypedParameterValue(new StringType(), null));
List<Employee> employeeList = query.getResultList();
In dieser Anwendung gab es eine Implementierungsklasse von UserType, die zwischen der JSONB-Spalte von PostgreSQL und der Zeichenfolge von Java konvertiert. In Spring Boot 2.0 (Hibernate 5.2.17) ist die SessionImplementor-Klasse für das Argument nullSafeGet / nullSafeSet weg und ist jetzt ein SharedSessionContractImplementor.
SpringBoot1.5
public class PostgresJsonType implements UserType {
@Override
public Object nullSafeGet(ResultSet rs, String[] names,
SessionImplementor session, Object owner)
throws HibernateException, SQLException {
//・ ・ ・
}
public void nullSafeSet(PreparedStatement st, Object value,
int index, SessionImplementor session)
throws HibernateException, SQLException {
//・ ・ ・
}
//・ ・ ・
}
SpringBoot2.0
public class PostgresJsonType implements UserType {
@Override
public Object nullSafeGet(ResultSet rs, String[] names,
SharedSessionContractImplementor session, Object owner)
throws HibernateException, SQLException {
//・ ・ ・
}
public void nullSafeSet(PreparedStatement st, Object value,
int index, SharedSessionContractImplementor session)
throws HibernateException, SQLException {
//・ ・ ・
}
//・ ・ ・
}
Dies wurde ursprünglich schlecht implementiert, aber in application.yml
app:
function:
message-type:
AAA: xxx
BBB: yyy
Beim Binden von Werten in Konfigurationseigenschaften
@ConfigurationProperties(prefix = "app.function.messageType")
Es war möglich, unter Bezugnahme auf das Kettengehäuse mit dem Kamelgehäuse zu binden.
In Spring Boot 2.0 wird die Prüfung streng, und wenn sie sich im obigen Zustand befindet, tritt ein Fehler auf. (Es ist natürlich, dass ein Fehler auftritt.)
Schreiben wir in einem Kettenkoffer entsprechend der Definition richtig. ..
@ConfigurationProperties(prefix = "app.function.message-type")
Es gibt viele Änderungen, die ich bei dieser Migration nicht festgestellt habe. Auf der offiziellen Website befindet sich Spring Boot 2.0-Migrationshandbuch. Weitere Informationen finden Sie ebenfalls. ..