[JAVA] Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0

Einführung

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.

Beiseite

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.

Spring Boot-Korrekturen

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>

Ändern Sie die Eigenschaften von application.yml

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

Adapterklasse abgeschafft

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 {

Paketänderung automatisch konfigurieren

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.

Ändern Sie die Konfiguration von PasswordEncoder-bezogenen Klassen

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.

Name / Typ der Repository-Methode ändern

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);

Ändern Sie, wie Paging im Repository generiert wird

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)));

Spezifikationen veraltet

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)));

Änderungen im Ruhezustand

Es gab auch eine Änderung, da die Hibernate-Version mit Spring Boot 2.0 auf 5.2.17 aktualisiert wurde.

Paketwechsel im Ruhezustand

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();

Änderung des UserType-Methodenarguments

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 {
        //・ ・ ・
    }

    //・ ・ ・
}

Andere

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")

Zusammenfassung

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. ..

Recommended Posts

Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Versuchen Sie Spring Boot von 0 bis 100.
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Änderungen von Java 8 zu Java 11
Einführung in Spring Boot ~ ~ DI ~
Einführung in Spring Boot ② ~ AOP ~
Wichtige Änderungen in Spring Boot 1.5
Einführung in Spring Boot Teil 1
Ändern Sie die Spring Boot-Validierungsnachricht
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Schreiben und Notizen bei der Migration von VB zu JAVA
ClassCastException tritt bei der Migration von Java7 auf Java8 auf. ~ Generics and overload ~
[Opensaml] NoClassDefFoundError tritt auf, wenn von Tomcat zu Weblogic gewechselt wird
Hinweise zum Zeichencode bei der Migration von Windows auf Mac
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
So stellen Sie Spring Boot + PostgreSQL ein
Hinweise zur Migration von CircleCI 1.0 auf 2.0
Verwendung von ModelMapper (Spring Boot)
Spring Boot ab Null Teil 2
Spring Boot ab Null Teil 1
02. Ich habe eine API erstellt, um eine Verbindung von Spring Boot zu MySQL (My Batis) herzustellen.
Ändern Sie die Spring Boot REST API-Anforderung / Antwort von CamelCase in SankeCase
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Spring Boot 2.0 Actuator, 3 Änderungen, die Sie wissen müssen, damit es funktioniert
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
Wichtige Änderungen im Zusammenhang mit Spring Framework 5.0 Test
Übergang von Struts2 zu Spring MVC (Controller)
Javaw.exe Fehler beim Starten von Spring Boot (STS)
So teilen Sie eine Spring Boot-Nachrichtendatei
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
Fehlerbehebung beim Anheben von Mastodon von v3.0.x auf v3.1.x.
So wenden Sie Thymeleaf-Änderungen sofort mit #Spring Boot + maven auf den Browser an
[Reverse] Spring Security (von Zeit zu Zeit aktualisiert)
Verwenden Sie den Thymeleaf-Textvorlagenmodus von Spring Boot
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Zusammenfassung der Punkte, über die ich mir bei der Migration von Java nach Kotlin Sorgen gemacht habe
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
So verkleinern Sie das Spring Boot Docker-Image
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Zusammenfassung des Mooses beim Update von JMockit 1.4 auf 1.30
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Wenn @Transactional of Spring Boot nicht funktioniert
Fordern Sie Spring Boot heraus
Wichtige Änderungen im Zusammenhang mit dem Spring Framework 5.0 DI-Container
Migration von der Eclipse-Serverfunktion (Tomcat) zum Einbetten von Tomcat
Einführung in Spring Boot + In-Memory Data Grid
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Berühren Sie alle "Anleitungen" des Frühlings (von Zeit zu Zeit aktualisiert)
Hinweise zu Anmerkungen beim Schreiben von Tests für Spring Boot
Spring Boot Form
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren