2016-11-10 1 views
1
public class SimpleDTO{ 
    private String firstElement; 
    private String lastElement; 
} 

public class ComplexSource{ 
    private List<String> elementList; 
} 

J'ai essayé de la carte à l'aide map().setFirstElement(source.getElementList().get(0)) mais je reçois une erreur indiquant « 1) Méthode source non valide java.util.List.get() Assurez-vous que la méthode. a zéro paramètre et ne renvoie pas de vide. "Modelmapper: Carte un élément dans une liste de champ dans POJO

Comment puis-je mapper un élément dans une liste à un champ dans un POJO en utilisant ModelMapper ou toute autre alternative?

Répondre

1

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)
+1

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

+0

@Matrix J'ai répondu à votre commentaire – Pau