Une multitude de librairie existe en Java pour effectuer cette opération.
Dans cet article nous utiliserons un des plus rapides soit MapStruct. Une comparaison est disponible à cette url.
Mappage avec les mêmes noms de champs
public class Person{private String name;
private String lastname;
private int age;
}
public class PersonDto{
private String name;
private String lastname;
}
Il suffit de créer une interface
@Mapper
public interface PersonMapper {
PersonDto personToPersonDTO(Person entity);
Person epersonDTOtoPerson(PersonDto dto);
}
MapStruct générera une classe d'implémentation. Ne surtout pas hésiter à la regarder pour voir le code généré pour éviter des surprises.
Mappage avec des noms différents de champs
public class Person{private String firstname;
private String lastname;
private int age;
}
public class PersonDto{
private String name;
private String lastname;
}
Il suffit de créer une interface et de spécifier les noms de source et de destination.
@Mapper
public interface PersonMapper {
@Mapping(target="lastname", source"firstname")
PersonDto personToPersonDTO(Person entity);
@Mapping(target="firstname", source="name")
Person epersonDTOtoPerson(PersonDto dto);
}
Mappage d'une valeur par défaut
Si un champ est null, il est possible d'assigner une valeur par défaut.@Mapper
public interface PersonMapper {
@Mapping(target="lastname", source"firstname", defaultValue="bob")
PersonDto personToPersonDTO(Person entity);
}
Mettre à jour un objet existant
@Mapperpublic interface PersonMapper {
void updatePersonFromDto(PersonDto dto, @MappingTarget Person entity);
}
Il suffit d'ajouter l'annotation MappingTarget à l'objet existant (l'entité devant être mis à jour).
Une multitude de possibilités existe, regardez la documentation
J'ai longtemps hésité à utiliser ce type de produit, car pour des cas plus complexes il peut être plus rapide de programmer soit même les affectations que de bien configurer l'outil et vérifier par la suite si le code généré correspondant à nos attentes.