[JAVA] Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1

Einführung

Spring Boot 1-Serie EOL wird am 1. August 2019 erreicht Also habe ich die Version von Spring Boot auf 2 Serien aktualisiert (1.5.2 2.1.5). Notieren Sie sich, was Sie damals getan haben.

Hauptkonfiguration

Was ich getan habe

Informationsbeschaffung

Der folgende offizielle Migrationsleitfaden beschreibt grundlegende Migrationsmethoden und Vorsichtsmaßnahmen. Spring Boot 2.0 Migration Guide

Ich habe beim Lesen des offiziellen Migrationsleitfadens gearbeitet und gegoogelt, um unklare Punkte oder Stolperpunkte zu lösen. Wir haben uns auch die Versionshinweise angesehen, um nach störenden Änderungen in Hauptbibliotheken zu suchen, die Hauptversionen ändern.

1. Fügen Sie zunächst "Spring-Boot-Properties-Migrator" zu den Abhängigkeiten hinzu (* Nach der Migration entfernen)

In Spring Boot 2 haben sich die in application.properties / application.yml definierten Eigenschaftsschlüssel und Einstellungen geändert. Wenn Sie Abhängigkeiten mit "spring-boot-properties-migrator" versehen, wird beim Start der Anwendung ein Warnprotokoll ausgegeben, wenn Eigenschaften vorhanden sind, deren Einstellungen noch veraltet sind. Es funktioniert auch vorübergehend mit dem alten Schreibstil für Immobilien.

Fügen Sie den Abhängigkeiten die Zeile ↓ hinzu. (* Entfernen, wenn die Migration abgeschlossen ist)

build.gradle


runtime "org.springframework.boot:spring-boot-properties-migrator"

2. Gradle Dependency Management-Plug-In hinzugefügt

In der ersten Serie war das Dependency Management-Plug-In im Spring Boot-Plug-In enthalten, in der zweiten Serie scheint sich das Dependency Management-Plug-In jedoch zu unterscheiden. Fügen Sie das Plug-In für das Abhängigkeitsmanagement zu build.gradle hinzu.

  apply plugin: 'org.springframework.boot'
+ apply plugin: 'io.spring.dependency-management' // <--Füge das hinzu

3. Erhöhen Sie die Version von Spring Boot

  etx {
-   springBootVersion = '1.5.2.RELEASE'
+   springBootVersion = '2.1.5.RELEASE'
  }

Durch Erhöhen der Version von Sprin Boot wird automatisch die Version verschiedener Bibliotheken erhöht.

Diesmal große Änderungen

Außerdem wurde die RDB-Verbindungspoolbibliothek von "Tomcat JDBC" in "HikariCP" geändert.

4. Spring Boot-Einstellungen

4.1 Gradle-Einstellungen

Die Aufgabe bootRepackage ist weg und heißt jetzt bootJar

build.gradle


bootJar {
  mainClassName = 'foo.bar.App'
  launchScript()                // <--mit bootRapackage`executable = true`Wenn Sie festgelegt haben, ist dies eine Alternative
}

4.2. Feste Schlüsselname beim Binden von Eigenschaften

Wenn Sie Spring Boot-Eigenschaften mit "@ ConfigurationProperties" oder "@ Value" an Java gebunden haben, müssen Sie die Notation des Eigenschaftsnamens mit "Canonical" vereinheitlichen. Weitere Informationen finden Sie unter Canonical-Eigenschaften von Spring Boot 2.0.

Grundsätzlich war es in Ordnung, wenn ich alle Kleinbuchstaben machte und "-" und "_" löschte.

- @ConfigurationProperties(prefix = "foo-bar.apiKey")
+ @ConfigurationProperties(prefix = "foobar.apikey")
  1. Spring Web MVC

5.1. WebMvcConfigurerAdapter→WebMvcConfigurer

Die Klasse "WebMvcConfigurerAdapter" ist veraltet und wurde in die Schnittstelle "WebMvcConfigurer" geändert.


- public class WebMvcConfig extends WebMvcConfigurerAdapter {
+ public class WebMvcConfig implements WebMvcConfigurer {

5.2. Der Controller kann URLs mit Erweiterungen nicht mehr automatisch zuordnen

@GetMapping("/users")
public List<Users> listUsers() {

Ich habe einen Endpunkt wie diesen vorbereitet und vom Frontend aus mit einem Pfad wie "GET / users.json" darauf zugegriffen, aber dies ist nicht mehr möglich. Es ist in Ordnung, normalerweise mit "GET / users" zuzugreifen, daher habe ich alle ".json" gelöscht.

  1. MySQL

Es wird 5.1 8.0

6.1. Umbenannte MySQL-Treiberklasse

Ich habe nach "com.mysql.jdbc.Driver" gesucht und durch "com.mysql.cj.jdbc.Driver" ersetzt.

  1. JOOQ

Es wird 3.9 3.11. Aufgrund der neuen Version von JOOQ wurden einige Korrekturen vorgenommen. Es ist eine gute Idee, die "Breaking Changes" in The jOOQ Release Note History durchzulesen.

7.1 Erhöhen Sie die Version des Gradle-Steckers von JOOQ

Nach JOOQ3.11.x müssen Sie das gradle-jooq-plugin3.x verwenden

 plugins {
-  id 'nu.studer.jooq' version '2.0.11'
+  id 'nu.studer.jooq' version '3.0.3'
 }

7.2 Feste Gradle-Einstellungen für die JOOQ-Codegenerierung

Behoben, weil sich der Paketname der API geändert hat

  mainDb(sourceSets.main) {
    jdbc {
      ...
    }
    generator {
-     name = 'org.jooq.util.DefaultGenerator'
+     name = 'org.jooq.codegen.DefaultGenerator'
      ...
      database {
-       name = 'org.jooq.util.mysql.MySQLDatabase'
+       name = 'org.jooq.meta.mysql.MySQLDatabase'
        ...

7.3 JOOQ neu generieren

Generieren Sie den Code neu

7.4. Cursor # fetchOne () wurde nicht mehr unterstützt

 while (cursor.hasNext()) 
-  Record record = cursor.fetchOne();
+  Record record = cursor.fetchNext();
  1. Flyway

8.1. Änderung des Eigenschaftsnamens

Der Eigenschaftsname von application.properties / application.yml lautet jetzt flyway. *spring.flyway. *

application.yml.diff


- flyway:
-   enabled: true
+ spring:
+   flyway:
+     enabled: true

8.2 Legen Sie den Namen der Verwaltungstabelle für den Migrationsausführungsverlauf fest

In Flyway 3 und 4 wurde der Ausführungsverlauf von Flyway in einer Tabelle mit dem Namen "schema_version" verwaltet, in 5 Serien wurde er jedoch in "flyway_schema_history" umbenannt. Um die Verwendung von "schema_version" fortzusetzen, setzen Sie die Eigenschaft "spring.flyway.table" in "application.properties" / "application.yml".

application.yml


spring:
  flyway:
    table: schema_version

Wenn Sie das Flyway-Plug-In mit Gradle verwenden, stellen Sie es auch dort ein.

build.gradle


flyway {
  ...
  table = 'schema_version'
}
  1. Thymeleaf

9.1 Abhängige Bibliotheken reparieren

- implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4'
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' // <---Spring Security Dialect-Upgrade

9.2 Die Beschreibungsmethode des Vorlagenlayouts wurde korrigiert

Die Layoutnotation wurde von Thymeleaf 3 geändert. Referenz:

Beispiel

Layout

layout/default.html.diff


  <!DOCTYPE html>
  <html lang="ja"
        xmlns:th="http://www.thymeleaf.org"
        xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
  <head>
    <meta charset="utf-8"/>
    <!-- 「{Titel jeder Seite} |Es wird ein Titel wie "App-Name"-->
-   <title layout:title-pattern="$CONTENT_TITLE | $DECORATOR_TITLE">App Name</title>
+   <title layout:title-pattern="$CONTENT_TITLE | $LAYOUT_TITLE">App Name</title>
    ...
  </head>
  <body>
    <!--Allgemeine HTML einbetten-->
-   <div layout:replace="common/header::partial"></div>
+   <div layout:replace="~{common/header::partial}"></div>

    <!--Erweitern Sie hier den Inhalt jeder Seite-->
    <div layout:fragment="content"></div>
  </bod>
  </html>
Einzelne Seite

sample/index.html.diff


  <!DOCTYPE html>
  <html
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      xmlns:th="http://www.springframework.org/schema/mvc"
-     layout:decorator="layout/default">
+     layout:decorate="~{layout/default}">
  <head>
    <title>Titel jeder Seite</title>
  </head>
  <body>
    <!--Inhalt jeder Seite-->
    <div layout:fragment="content">
      Hello World
    </div>
  </body>
  </html>

10. Verbindungspool

Ändern Sie die Einstellungen, da sie von Tomcat JDBC zu Hikari CP geändert wurden.

Der Eigenschaftsname lautet spring.datasource.tomcat.*spring.datasource.hikari.* Wird sein.

Elemente, die mit HikariCP festgelegt werden können, befinden sich in com.zaxxer.hikari.HikariConfig. Es ist definiert.

Fehlerbehebung

Frontend-Build-Inhalte werden beim Generieren von Jar nicht mehr berücksichtigt

Ursprünglich definierte Gradle eine Aufgabe zum Erstellen des Frontends und zum Ausführen, wenn das Glas erstellt wurde.

build.gradle


jar.dependsOn compileFrontend

Aus der Spring Boot 2-Serie wird jar jedoch von der bootJar-Task generiert, daher habe ich es als ↓ geändert

build.gradle


bootJar.dependsOn compileFrontend

DBUnit ist Moos (MySQL)

org.dbunit.database.AmbiguousTableNameException: ACCOUNTS

Es scheint, dass ein Fehler auftritt, wenn eine Tabelle mit demselben Namen in mehreren Datenbanken vorhanden ist. Ich habe es behoben, indem ich den Abfrageparameter "nullCatalogMeansCurrent = true" zur JDBC-URL hinzugefügt habe. (Es scheint, dass sich das Standardverhalten des MySQL JDBC-Treibers geändert hat.)

Moos beim AUSWÄHLEN im Feld TINYINT (1) in JOOQ

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Byte

Als Richtlinie bei Verwendung von JOOQ wurde "BIT (1)" auf Boolean und "TINYINT (1)" auf Byte abgebildet. Nach dem Update auf Spring Boot 2 wurde TINYINT (1 ) jedoch Boolean zugeordnet und eine ClassCastException trat auf.

Ich habe es behoben, indem ich den Abfrageparameter "tinyInt1isBit = false" zur JDBC-URL hinzugefügt habe. Der JDBC-Treiber von MySQL scheint TINYINT (1) intern als BIT (1) zu behandeln, und es scheint, dass er boolesch geworden ist.

IllegalArgumentException, wenn "_" im Domainnamen von WEB enthalten ist

java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.

Es scheint, dass die Version von Tomcat aktualisiert wurde und keine Domainnamen mehr akzeptiert, die "" enthalten. (Es scheint seltsam, dass der Domainname "" als RFC-Spezifikation enthält.) → Da _ in der Subdomain enthalten war, habe ich den Namen der Subdomain geändert, um damit umzugehen.

Referenz: https://stackoverflow.com/questions/53504857/the-character-is-never-valid-in-a-domain-name

Recommended Posts

Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Ä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
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Wechsel von AWS zu PaizaCloud
Einführung in Spring Boot ② ~ AOP ~
Einführung in Spring Boot Teil 1
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
Verwendung von ModelMapper (Spring Boot)
Spring Boot ab Null Teil 2
Spring Boot ab Null Teil 1
Ä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
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
Übergang von Struts2 zu Spring MVC (Controller)
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
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.
[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)
Verwendung des eingebauten h2db mit Federstiefel
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
So verkleinern Sie das Spring Boot Docker-Image
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
So fügen Sie in Spring Boot einen Klassenpfad hinzu
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
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
Wenden Sie Twitter Bootstrap 4 mithilfe von Webjars auf Spring Boot 2 an
Spring Boot Denken Sie daran
◆ Rufen Sie die von Spring Boot erstellte API von React ab
gae + frühlingsstiefel
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Bei der Einführung von JOOQ in Spring Boot wurde eine Geschichte behandelt, die behandelt wurde, weil bei Liquidbase ein Fehler aufgetreten ist
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
Vorsichtsmaßnahmen beim Konvertieren von Dezimal in Binär
Vom Erstellen eines Spring Boot-Projekts bis zum Ausführen einer Anwendung mit VS Code
Vom Aufbau einer AWS-Cloud-Umgebung bis zur Bereitstellung einer Spring Boot-App (für Anfänger)
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Eine Seite, die leicht zu verstehen war, als ich anfing, Spring Boot zu lernen
Pläne zur Unterstützung von JDK 11 für Eclipse und Spring Boot