[Java] Remplaçons les objets de données par un mappeur ~ BeanMapper Orika ~

Qu'est-ce que Orika

Une bibliothèque qui peut être mappée aux POJO et aux beans. Pratique car vous pouvez facilement spécifier le mappage et la conversion de type.

Mappage automatique des propriétés des objets

environnement d'utilisation

Outil de création Cadre
Gradle Spring Boot

Le framework est utilisé pour DI les objets Orika. (Voir ci-dessous)

① Préparation à l'utilisation de la bibliothèque

Ajoutez la ligne suivante aux dépendances de build.gradle. Veuillez lire la version appropriée.

build.gradle


compile group: 'ma.glasnost.orika', name: 'orika-core', version: '1.5.4'

** Si vous utilisez un autre outil de compilation, veuillez utiliser [ce lien](https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core/1.5.4) pour décrire la description en fonction de votre environnement. prière de se référer à. ** **

② Instancier MapperFactory

Vous pouvez nouveau dans la classe que vous utilisez, mais officiellement, il est préférable de la rendre singleton Il semble que les performances soient bonnes, donc cette fois j'ai utilisé la fonction DI de Spring pour le rendre singleton.

ConvertMapper.class



@Componet
public class ConvertMapper {

  @Bean
  public MapperFactory getMapperFactory(){
    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    return mapperFactory;
  }
}

Variables de champ de la classe qui effectue le traitement de conversion


@Autowired
private MapperFactory mapperFactory;

③ Définissez la classe source et la classe de destination de Convert

Définissez le nom de classe de l'objet (celui pour lequel les données sont définies) comme nom de classe source de conversion, Définissez le nom de classe de l'objet à convertir (celui que vous souhaitez définir à partir de maintenant) dans le nom de classe de destination de la conversion.

Méthode de classe qui effectue le traitement de conversion


 BoundMapperFacade<Convertir le nom de la classe source,Convertir le nom de la classe de destination> boundMapperFacade =
        mapperFactory.getMapperFacade(Convertir le nom de la classe source.class,Convertir le nom de la classe de destination.class);

④ Implémentation de Convert

Méthode de classe qui effectue le traitement de conversion


Convertir l'objet de destination= boundMapperFacade.map(Convertir l'objet source);

Ceci termine la conversion.

Comment mapper manuellement les propriétés d'un objet

Si vous avez une classe avec la structure suivante et que vous souhaitez convertir de A en B, ** Ne peut pas être converti par mappage automatique car les noms des variables de champ sont différents. ** **

Moule Convertir la source Convertir la destination
ClassA ClassB
int id id
String propatyA propatyB

Par conséquent, il est nécessaire de spécifier explicitement le nom de la propriété associée avant de convertir l'objet. ** * [Mapper automatiquement les propriétés des objets](https://qiita.com/NekozeDaisensei/items/92e9d5d653119a90f991#%E3%82%AA%E3%83%96%E3%82%B8%E3%82% A7% E3% 82% FA% E3% 83% 88% E3% 81% AE% E3% 83% 97% E3% 83% AD% E3% 83% 91% E3% 83% 86% E3% 82% A3% E3% 82% 92% E8% 87% AA% E5% 8B% 95 mappage% E3% 81% 99% E3% 82% 8B) Idem jusqu'à l'étape ③ **

Méthode de classe qui effectue le traitement de conversion


mapperFactory.classMap(InputEstimateData.class, EstimateDataValue.class)
        .field("propatyA","propatyB") //Spécifiez le nom de la propriété à mapper.
        .byDefault()                  //Le reste est automatiquement mappé
        .register();

//Idem pour l'exécution de Convert
Convertir l'objet de destination= boundMapperFacade.map(Convertir l'objet source);

Convertir des types et des données avec Convert

Si vous souhaitez convertir un type spécifique avec Convertir, procédez comme suit.

① Créez une classe pour la conversion de type

Créez une classe qui hérite des classes suivantes en fonction des conditions de conversion.

Conversion unidirectionnelle uniquement Conversion bidirectionnelle
ma.glasnost.orika.CustomConverter ma.glasnost.orika.converter.BidirectionalConverter

Un exemple est une classe de conversion bidirectionnelle de type java.sql.Timestamp et de type java.util.LocalDateTime.

Exemple: conversion bidirectionnelle entre LocalDateTime et Timestamp


import java.sql.Timestamp;
import java.time.LocalDateTime;

public class DataConverter extends BidirectionalConverter<LocalDateTime, Timestamp> {
  @Override
  public Timestamp convertTo(LocalDateTime source, Type<Timestamp> destinationType, MappingContext mappingContext) {
    return Timestamp.valueOf(source);
  }

  @Override
  public LocalDateTime convertFrom(Timestamp source, Type<LocalDateTime> destinationType, MappingContext mappingContext) {
    return source.toLocalDateTime();
  }
}

(2) Enregistrez la classe de conversion dans ConverterFactory

Il existe deux façons de s'inscrire.

Méthode 1. Lors de l'application à toutes les conversions

python


ConverterFactory converterFactory = mapperFactory.getConverterFactory();
converterFactory.registerConverter(new DataConverter());

Méthode 2. Lors de la spécification de la propriété cible lors de la conversion

ConverterFactory converterFactory = mapperFactory.getConverterFactory();
converterFactory.registerConverter("Nom de la direction",new DataConverter());

Définissez le contenu ci-dessus avec la méthode qui crée une instance de MapperFactory.

ConvertMapper.class



@Componet
public class ConvertMapper {

  @Bean
  public MapperFactory getMapperFactory(){
    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    //Obtenez Converter Factory
    ConverterFactory converterFactory = mapperFactory.getConverterFactory();
        
    //Lors de la spécification de la propriété cible au moment de la conversion
    converterFactory.registerConverter("Nom de la direction",new DataConverter());
    
    //Lors de l'application à toutes les conversions
    converterFactory.registerConverter(new DataConverter());
    
    return mapperFactory;
  }
}

③ Paramètres de conversion et conversion

BoundMapperFacade<Convertir le nom de la classe source,Convertir le nom de la classe de destination> boundMapperFacade =
        mapperFactory.getMapperFacade(Convertir le nom de la classe source.class,Convertir le nom de la classe de destination.class);

//Définir les conditions de conversion pour la méthode 2 (non requis pour la méthode 2)
// java.util.LocalDateTime java.sql.Convertir en type et carte d'horodatage
mapperFactory.classMap(Convertir le nom de la classe source.class,Convertir le nom de la classe de destination.class)
  .fieldMap("Nom de propriété à mapper de la classe source Convert","Nom de propriété à mapper de la classe de destination Convertir")
  .converter("Nom de gestion spécifié lors de l'enregistrement auprès de ConverterFactory")
  .add()
  .byDefault()
  .register();

//Idem pour l'exécution de Convert
Convertir l'objet de destination= boundMapperFacade.map(Convertir l'objet source);

Épilogue

C'était une façon d'utiliser Orika de BeanMapper, ce qui est pratique mais pas très visible. Je sens que je peux faire la plupart des choses que j'écris ici.

Ce qui n'attrape pas la lumière, c'est que Lombok peut créer un constructeur qui définit des arguments pour toutes les propriétés ... Après tout, cela ne vous sort pas de Getter Hell. Ceci est pratique car Orika mappera automatiquement si le nom de propriété est le même.

Recommended Posts

[Java] Remplaçons les objets de données par un mappeur ~ BeanMapper Orika ~
Créons un processus chronométré avec la minuterie de Java! !!
Raclons avec Java! !!
[Bases de Java] Créons un triangle avec une instruction for
Exploitons Excel avec Java! !!
Utilisation de Mapper avec Java (Spring)
Remplacer par une valeur selon la correspondance avec une expression régulière Java
Construire un projet Java avec Gradle
Trier la liste des objets Java
Déclarez une méthode qui a une valeur de retour Java avec le type de données de valeur de retour
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
Allons-y avec Watson Assistant (anciennement Conversation) ⑤ Créez un chatbot avec Watson + Java + Slack
Faisons une carte de Noël avec Processing!
Essayons WebSocket avec Java et javascript!
Créons un environnement de développement Java (mise à jour)
Diviser une chaîne avec ". (Dot)" en Java
[Java] Créons une bibliothèque d'accès à la base de données!