Dans ce cas est que vous ne pouvez pas utiliser un PropertyMap
. Si vous souhaitez le mapper en utilisant ModelMapper
, vous devez utiliser un Converter
au lieu de PropertyMap
comme vous l'avez fait.
d'abord votre convertisseur serait aussi suivant où le source
est ComplexSource
et SimpleDTO
est la destination:
Converter<ComplexSource, SimpleDTO> converter = new AbstractConverter<ComplexSource, SimpleDTO>() {
@Override
protected SimpleDTO convert(ComplexSource source) {
SimpleDTO destination = new SimpleDTO();
List<String> sourceList = source.getElementList();
if(null != sourceList && !sourceList.isEmpty()){
int sizeList = sourceList.size();
destination.setFirstElement(sourceList.get(0));
destination.setLastElement(sourceList.get(sizeList - 1));
}
return destination;
}
};
Ensuite il vous suffit d'ajouter le convertisseur à votre ModelMapper
exemple:
ModelMapper mapper = new ModelMapper();
mapper.addConverter(converter);
Si vous essayez de la carte, il fonctionne parfaitement:
ComplexSource complexSource = new ComplexSource();
complexSource.setElementList(Arrays.asList("firstElement", "lastElement"));
SimpleDTO simpleDto = mapper.map(complexSource, SimpleDTO.class);
System.out.println(simpleDto);
Sortie
SimpleDTO [firstElement = firstElement, lastElement = lastElement]
Respect de votre commentaire, vous devez vérifier les valeurs NULL si elle est nécessaire dans votre instance de source (en dans ce cas, il est possible d'utiliser un pointeur nul si la liste est nulle). Mais cela vous permet de définir l'instance de destination, même si vous pouvez configurer l'instance de destination comme vous le souhaitez avec un Provider
(Providers documentation).
Dans les cas d'utilisation spéciale comme ceci, vous devez vous soucier de la gestion des exceptions et des vérifications nuls car un Converter
je dirais que c'est la façon de modelmapper de mapper manuellement les pojos.
Les advantadges d'utilisation ModelMapper sont expliqués dans le web:
- Si vous configurez correctement dans certains cas, il est inutile de faire la carte manuellement.
- Il centralise le mappage.
- Il fournit une API de mappage pour la gestion des cas d'utilisation spéciaux. (Ceci est votre cas)
- Et ainsi de suite (un coup d'oeil son web)
Merci! Question tangentielle, quel est l'avantage d'utiliser un ModelMapper vs en utilisant une simple méthode de mappeur pour convertir un objet en un autre? J'ai supposé que je n'aurais pas à m'inquiéter des vérifications nuls et de la gestion des exceptions avec un mappeur tiers, mais j'ai l'impression que je me trompe à mon avis. – Matrix
@Matrix J'ai répondu à votre commentaire – Pau