[JAVA] L'histoire de la transition de Spring Boot 1.5 à 2.1

introduction

Série Spring Boot 1 EOL sera atteinte le 1er août 2019 J'ai donc mis à jour la version de Spring Boot vers la série 2 (1.5.2 2.1.5). Notez ce que vous avez fait à ce moment-là.

Configuration principale

Ce que j'ai fait

La collecte d'informations

Le guide de migration officiel ci-dessous décrit les méthodes de migration de base et les précautions. Spring Boot 2.0 Migration Guide

J'ai travaillé en lisant le guide officiel de la migration et j'ai cherché sur Google pour résoudre les points incertains ou les points d'achoppement. Nous avons également examiné les notes de publication pour vérifier les changements perturbateurs dans les principales bibliothèques qui modifient les versions principales.

1. Tout d'abord, ajoutez spring-boot-properties-migrator aux dépendances (* Supprimer après la migration)

Dans Spring Boot 2, les clés de propriété et les paramètres définis dans ʻapplication.properties / ʻapplication.yml ont changé. Si vous ajoutez spring-boot-properties-migrator aux dépendances, un journal d'avertissement sera généré au démarrage de l'application s'il y a des propriétés dont les paramètres sont toujours obsolètes. Il fonctionne également temporairement avec l'ancien style d'écriture de la propriété.

Ajoutez la ligne ↓ aux dépendances. (* Supprimer lorsque la migration est terminée)

build.gradle


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

2. Ajout du plug-in Gradle Dependency Management

Dans la 1ère série, le plug-in de gestion des dépendances était inclus dans le plug-in Spring Boot, mais à partir de la 2e série, le plug-in de gestion des dépendances semble être différent. Ajoutez le plug-in de gestion des dépendances à build.gradle.

  apply plugin: 'org.springframework.boot'
+ apply plugin: 'io.spring.dependency-management' // <--Ajoute ça

3. Augmentez la version de Spring Boot

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

L'augmentation de la version de Sprin Boot augmentera automatiquement la version de diverses bibliothèques.

Changements majeurs cette fois

De plus, la bibliothèque du pool de connexions RDB est passée de «Tomcat JDBC» à «HikariCP».

4. Paramètres de Spring Boot

4.1. Paramètres Gradle

La tâche bootRepackage a disparu et est maintenant une tâche nommée bootJar

build.gradle


bootJar {
  mainClassName = 'foo.bar.App'
  launchScript()                // <--avec bootRapackage`executable = true`Si vous avez défini, c'est une alternative
}

4.2. Nom de clé fixe lors de la liaison des propriétés

Si vous avez lié les propriétés Spring Boot à Java avec @ ConfigurationProperties ou @ Value, vous devez unifier la notation du nom de propriété en" Canonical ". Voir Propriétés canoniques de Spring Boot 2.0 pour plus d'informations.

Fondamentalement, c'était OK si je mettais toutes les minuscules et supprimais "-" et "_"

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

5.1. WebMvcConfigurerAdapter→WebMvcConfigurer

La classe WebMvcConfigurerAdapter a été déconseillée et remplacée par l'interface WebMvcConfigurer.


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

5.2. Le contrôleur ne peut plus mapper automatiquement les URL avec des extensions

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

J'ai préparé un point de terminaison comme celui-ci et y ai accédé depuis le front-end avec un chemin comme GET / users.json, mais ce n'est plus possible. C'est OK pour accéder avec GET / users normalement, donc j'ai supprimé tout .json.

  1. MySQL

Cela devient 5.1 8.0

6.1. Classe de pilote MySQL renommée

J'ai cherché com.mysql.jdbc.Driver et l'ai remplacé par com.mysql.cj.jdbc.Driver.

  1. JOOQ

Il devient «3.9» → «3.11». En raison de la nouvelle version d'OJOQ, certaines corrections ont été apportées. C'est une bonne idée de lire les Breaking changes dans The jOOQ Release Note History.

7.1. Augmenter la version de la fiche Gradle d'OJOQ

Après JOOQ3.11.x, vous devez utiliser gradle-jooq-plugin3.x

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

7.2. Correction des paramètres Gradle pour la génération de code JOOQ

Corrigé car le nom du package de l'API a changé

  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. Régénérer OJOQ

Régénérer le code

7.4. Correction du curseur # fetchOne () obsolète

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

8.1. Changement de nom de propriété

Le nom de propriété de application.properties / application.yml est désormais flyway. *spring.flyway. *

application.yml.diff


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

8.2. Définir le nom de la table de gestion de l'historique des exécutions de migration

Dans Flyway 3 et 4, l'historique d'exécution de Flyway était géré dans une table nommée schema_version, mais dans 5 séries, il a été renommé en flyway_schema_history. Pour continuer à utiliser schema_version, définissez la propriété spring.flyway.table dans ʻapplication.properties / ʻapplication.yml.

application.yml


spring:
  flyway:
    table: schema_version

De plus, si vous utilisez le plug-in Flyway avec Gradle, définissez-le également.

build.gradle


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

9.1. Correction des bibliothèques dépendantes

- implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4'
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' // <---Mise à niveau de Spring Security Dialect

9.2. Correction de la méthode de description de la mise en page du modèle

La notation de mise en page a changé depuis Thymeleaf 3. référence:

Exemple

Disposition

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"/>
    <!-- 「{Titre de chaque page} |Cela devient un titre comme "nom de l'application"-->
-   <title layout:title-pattern="$CONTENT_TITLE | $DECORATOR_TITLE">nom de l'application</title>
+   <title layout:title-pattern="$CONTENT_TITLE | $LAYOUT_TITLE">nom de l'application</title>
    ...
  </head>
  <body>
    <!--Incorporer du HTML commun-->
-   <div layout:replace="common/header::partial"></div>
+   <div layout:replace="~{common/header::partial}"></div>

    <!--Développez le contenu de chaque page ici-->
    <div layout:fragment="content"></div>
  </bod>
  </html>
Page individuelle

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>Titre de chaque page</title>
  </head>
  <body>
    <!--Contenu de chaque page-->
    <div layout:fragment="content">
      Hello World
    </div>
  </body>
  </html>

10. Pool de connexion

Depuis le passage de Tomcat JDBC à HikariCP, modifiez les paramètres.

Le nom de la propriété est spring.datasource.tomcat.*spring.datasource.hikari.* Sera.

Les éléments qui peuvent être définis avec HikariCP se trouvent dans com.zaxxer.hikari.HikariConfig Il est défini.

dépannage

Le contenu de construction frontend n'est plus inclus lors de la génération de Jar

À l'origine, Gradle définissait la tâche de construction du frontal et le configurait pour qu'il s'exécute lorsque le pot a été créé.

build.gradle


jar.dependsOn compileFrontend

Cependant, à partir de la série Spring Boot 2, le jar est généré par la tâche bootJar, je l'ai donc changé comme ↓

build.gradle


bootJar.dependsOn compileFrontend

DBUnit est de la mousse (MySQL)

org.dbunit.database.AmbiguousTableNameException: ACCOUNTS

Il semble qu'une erreur se produit lorsqu'une table portant le même nom existe sur plusieurs bases de données. Je l'ai corrigé en ajoutant le paramètre de requête nullCatalogMeansCurrent = true à l'URL JDBC. (Il semble que le comportement par défaut du pilote MySQL JDBC a changé)

Mousse lors de la sélection sur le champ TINYINT (1) dans JOOQ

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

En tant que politique lors de l'utilisation de JOOQ, BIT (1) a été mappé à Boolean et TINYINT (1) a été mappé à Byte. Cependant, après la mise à jour vers Spring Boot 2, TINYINT (1) a été mappé à Boolean et une ClassCastException s'est produite.

Je l'ai corrigé en ajoutant le paramètre de requête tinyInt1isBit = false à l'URL JDBC. Le pilote JDBC de MySQL semble traiter «TINYINT (1)» comme «BIT (1)» en interne, et il semble qu'il soit devenu booléen.

IllegalArgumentException lorsque "_" est inclus dans le nom de domaine de WEB

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

Il semble que la version de Tomcat a été mise à jour et n'accepte plus les noms de domaine contenant _. (Il semble étrange que le nom de domaine inclue _ comme spécification RFC.) → Puisque _ était inclus dans le sous-domaine, j'ai changé le nom du sous-domaine pour le gérer.

Référence: https://stackoverflow.com/questions/53504857/the-character-is-never-valid-in-a-domain-name

Recommended Posts

L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Passer d'AWS à PaizaCloud
Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot, partie 1
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Comment utiliser ModelMapper (Spring boot)
Spring Boot à partir de zéro Partie 2
Spring Boot à partir de zéro Partie 1
Changer la demande / réponse de l'API REST Spring Boot de CamelCase à SankeCase
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
[Introduction à Spring Boot] Vérification de la validation du formulaire
Transition de Struts2 à Spring MVC (contrôleur)
Précautions lors de la migration de VB6.0 vers JAVA
Erreur Javaw.exe lors du démarrage de Spring Boot (STS)
Comment diviser un fichier de message Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Dépannage lors de la montée de Mastodon de la v3.0.x à la v3.1.x
[Inverser] Spring Security (mis à jour de temps en temps)
Utilisez le mode de modèle de texte Thymeleaf de Spring Boot
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Comment réduire l'image de Spring Boot Docker
Résumé de la mousse lors de la mise à jour de JMockit 1.4 vers 1.30
[Spring Boot] Comment obtenir des propriétés dynamiquement à partir d'une chaîne contenue dans une URL
Essayez d'implémenter la fonction de connexion avec Spring Boot
Lorsque @Transactional of Spring Boot ne fonctionne pas
Défi Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Introduction à Spring Boot + In-Memory Data Grid
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Appuyez sur tous les "Guides" de Spring (mis à jour de temps en temps)
Remarques sur les annotations lors de l'écriture de tests pour Spring Boot
Forme de botte de printemps
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Spring Boot Rappelez-vous
◆ Obtenez l'API créée par Spring Boot à partir de React
gae + botte à ressort
[Spring Boot] Comment se référer au fichier de propriétés
Lors de l'introduction de JOOQ dans Spring Boot, une histoire qui a été traitée parce qu'une erreur s'est produite autour de Liquidbase
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Spring Boot - Comment définir le délai d'expiration de la session
Précautions lors de la conversion de décimal en binaire
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code
De la création d'un environnement cloud AWS au déploiement d'une application Spring Boot (pour les débutants)
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Un site facile à comprendre lorsque j'ai commencé à apprendre Spring Boot
Plans pour prendre en charge JDK 11 pour Eclipse et Spring Boot