[JAVA] Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0

introduction

J'écrirai les points de correction lors de la migration de l'application de Spring Boot 1.5 (environ 7KL, partie serveur de SPA) vers Spring Boot 2.0. Un bon nombre de modifications ont été nécessaires, telles que la modification des packages de classe et la déconseillée.

De côté

Au début, je n'avais pas l'intention de définir Spring Boot sur 2.0, je voulais juste accéder à Elasticsearch 6, mais pour accéder à Elasticsearch 6, je dois augmenter spring-boot-starter-data-elasticsearch à 2.0 unités. Je n'avais pas d'autre choix que d'augmenter Spring Boot lui-même à 2.0.

Corrections de Spring Boot

Maven

L'application migrée cette fois dépend des bibliothèques suivantes.

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>

À l'origine, j'utilisais Spring IO platform, mais EOL est septembre 2019, et "spring-boot-starter-parent" Il est recommandé de l'utiliser ou d'importer les dépendances de spring-boot bom. " Suite à la recommandation, j'ai décidé de passer de la plate-forme Spring IO à spring-boot-starter-parent.

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>

Modifier les propriétés de application.yml

La hiérarchie des chemins de contexte a changé. Cela semble fonctionner tel quel, mais il est plus sûr de le changer.

SpringBoot1.5


server:
  context-path: /sample

SpringBoot2.0


server:
  servlet:
    context-path: /sample

Classe d'adaptateur supprimée

Puisque Spring Boot 2.0 est compatible Java 8, la classe Adapter, qui implémente l'interface vide, est obsolète et l'implémentation par défaut de la méthode a été ajoutée à l'interface elle-même. Par conséquent, la modification consiste à implémenter l'interface directement au lieu d'étendre l'adaptateur.

SpringBoot1.5


public class WebMvcConfig extends WebMvcConfigurerAdapter {

SpringBoot2.0


public class WebMvcConfig implements WebMvcConfigurer {

Changement de package de configuration automatique

J'ai exclu SecurityAutoConfiguration, qui est une configuration automatique de la sécurité, afin de changer les paramètres de sécurité en fonction du profil, mais ce package SecurityAutoConfiguration a changé.

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)

Il semble qu'il a été déplacé vers le package de servlet supplémentaire sous le package de sécurité.

Modifier la configuration des classes associées à PasswordEncoder

J'utilisais ShaPasswordEncoder pour le cache interne, mais la classe elle-même a disparu. La structure de classe liée à PasswordEncoder a été revue. Parallèlement à cela, la classe ShaPasswordEncoder et la classe Md5PasswordEncoder qui utilisaient des algorithmes vulnérables ont disparu (l'algorithme lui-même semble rester, mais il est [obsolète]](https: //info.michael-simons. eu / 2018/01/13 / spring-security-5-new-password-storage-format /)).

À partir de Spring Boot 2.0, PasswordEncoder sera généré à l'aide de PasswordEncoderFactories.

SpringBoot1.5


MessageDigestPasswordEncoder encoder = new ShaPasswordEncoder(256);
return encoder.encodePassword(password);

SpringBoot2.0


PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
return encoder.encode(password);

La méthode est également passée de encodePassword () à encode ().

Changement de nom / type de méthode de référentiel

La partie la plus difficile de ce correctif était la suivante (car il y en avait tellement ...). La méthode findOne () de CrudRepository a été renommée findById (), et la valeur de retour est désormais un type facultatif au lieu d'un type d'entité.

SpringBoot1.5


Employee employee = employeeRepository.findOne(employeeId);

SpringBoot2.0


Optional<Employee> employee = employeeRepository.findById(employeeId);

Modifier la façon de générer la pagination dans le référentiel

PageRequest new est obsolète. Utilisez plutôt ().

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

Si vous changez PageRequest en of (), vous devez changer Sort en of () pour unifier le style.

SpringBoot2.0


employeeRepository.findAll(specifications,
        PageRequest.of(page, size, Sort.of(
                Sort.Direction.fromString(sortDirection), sortColumn)));

Spécifications obsolètes

Avec Java 8 et l'ajout d'une implémentation par défaut à l'interface Specification, l'utilisation directe de la classe Specifications qui implémente l'interface Specification est obsolète. (Bien que l'implémentation par défaut de l'interface Specification utilise la classe Specifications.)

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

Modifications de la mise en veille prolongée

Il y a également eu un changement en raison de la mise à niveau de la version Hibernate vers la version 5.2.17 avec Spring Boot 2.0.

Changement de package Hibernate

J'ai utilisé la classe ExplicitParameterInfo lorsque je voulais spécifier explicitement NULL en utilisant NativeQuery d'Hibernate, mais le package de cette classe est de ʻorg.hibernate.jpa.criteria.compile.ExplicitParameterInfo à ʻorg.hibernate.query Changé en .criteria.internal.compile.ExplicitParameterInfo.

** Addendum / Mise à jour du 12/07/2018 ** Dans le cas de PostgreSQL 10, au moins ExplicitParameterInfo ne peut plus être spécifié lors de la spécification de NULL. Lorsque j'utilise ExplicitParameterInfo, j'obtiens une erreur comme "ʻorg.postgresql.util.PSQLException: ERREUR: l'opérateur n'existe pas: text = by tea`". Par conséquent, si vous souhaitez spécifier un type NULL, utilisez TypedParameterValue au lieu de ExplicitParameterInfo.

SpringBoot1.5


import org.hibernate.jpa.criteria.compile.ExplicitParameterInfo;

//Omission

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;

//Omission

Query query = entityManager.createNativeQuery(query);
query.setParameter("employeeName", new TypedParameterValue(new StringType(), null));
List<Employee> employeeList = query.getResultList();

Modification de l'argument de la méthode UserType

Dans cette application, il y avait une classe d'implémentation de UserType qui convertit entre la colonne JSONB de PostgreSQL et la chaîne de Java. Dans Spring Boot 2.0 (Hibernate 5.2.17), la classe SessionImplementor pour l'argument nullSafeGet / nullSafeSet a disparu et est maintenant un 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 {
        //・ ・ ・
    }

    //・ ・ ・
}

Autre

Cela a été à l'origine mal implémenté, mais dans application.yml

app:
  function:
    message-type:
      AAA: xxx
      BBB: yyy

Lors de la liaison de valeurs dans les propriétés de configuration

@ConfigurationProperties(prefix = "app.function.messageType")

Il était possible de lier en se référant à l'étui de la chaîne avec l'étui camel.

Dans Spring Boot 2.0, la vérification devient stricte, et si elle est dans l'état ci-dessus, une erreur se produira. (Il est naturel qu'une erreur se produise.)

Écrivons correctement un cas de chaîne selon la définition. ..

@ConfigurationProperties(prefix = "app.function.message-type")

Résumé

Il y a de nombreux changements que je n'ai pas rencontrés dans cette migration. Il y a Spring Boot 2.0 Migration Guide sur le site officiel, veuillez donc vous y référer également. ..

Recommended Posts

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
L'histoire de la transition de Spring Boot 1.5 à 2.1
Essayez Spring Boot de 0 à 100.
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Précautions lors de la migration de VB6.0 vers JAVA
Changements de Java 8 à Java 11
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Changements majeurs dans Spring Boot 1.5
Introduction à Spring Boot, partie 1
Modifier le message de validation Spring Boot
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Comment écrire et noter lors de la migration de VB vers JAVA
ClassCastException se produit lors de la migration de Java7 vers Java8 ~ Génériques et surcharge ~
[Opensaml] NoClassDefFoundError se produit lors du passage de Tomcat à weblogic
Remarques sur le code de caractère lors de la migration de Windows vers Mac
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Comment configurer Spring Boot + PostgreSQL
Remarques sur la migration de CircleCI 1.0 vers 2.0
Comment utiliser ModelMapper (Spring boot)
Spring Boot à partir de zéro Partie 2
Spring Boot à partir de zéro Partie 1
02. J'ai créé une API pour me connecter de Spring Boot à MySQL (My Batis)
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
Actionneur Spring Boot 2.0, 3 changements à connaître pour le faire fonctionner
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
[Introduction à Spring Boot] Vérification de la validation du formulaire
Modifications majeures liées au test Spring Framework 5.0
Transition de Struts2 à Spring MVC (contrôleur)
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
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
[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)
Résumé des points qui m'inquiétaient lors de la migration de Java vers Kotlin
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
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
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
Modifications majeures liées au conteneur Spring Framework 5.0 DI
Migration de la fonction serveur Eclipse (Tomcat) vers Embed Tomcat
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