2016-05-31 1 views
2

J'utilise Orika 1.4.6 et j'aimerais utiliser un CustomConverter pour mapper un de mes champs. Lorsque le champ source est nul, le convertisseur ne semble pas être appelé. Voici mon code:Orika: CustomConverter n'est pas appelé sur les valeurs nulles

class From { 
    String source; 
} 

class To { 
    String destination = "defaultValue"; 
} 

public class Mapper extends ConfigurableMapper { 

    private class MyConverter extends CustomConverter<String, String> { 

    @Override 
    public String convert(String source, Type<? extends String> destinationType) { 
     if (null == source) { 
     return "NULL!"; 
     } 
     return "->" + source + "<-"; 
    } 
    } 

    @Override 
    protected void configure(MapperFactory factory) { 

    factory.getConverterFactory().registerConverter("converter", new MyConverter()); 

    factory.classMap(From.class, To.class) 

     .fieldMap("source", "destination") 
     .mapNulls(true) 
     .converter("converter") 
     .add() 

    .register(); 
    } 
} 

Si je mapper l'objet suivant:

From from = new From(); //from.source == null 

Mapper mapper = new Mapper(); 
To to = mapper.map(from, To.class); 

System.out.println(to.destination); 

J'attends la sortie suivante:

NULL! 

Cependant, je reçois le texte suivant:

null 

qui suggère que le convertisseur n'est pas appelée du tout et la valeur NULL est simplement copié, en raison de

.mapNulls(true) 

Si je vous présenter maintenant

.mapNulls(false) 

le problème reste le même, que la valeur nulle dans le champ source est ignorée ce qui laisse le champ de destination inchangé (dans ce cas, avec la valeur "defaultValue").

Il serait par exemple possible d'utiliser la méthode "customize" en combinaison avec un CustomMapper. Cependant cette solution est beaucoup plus complexe dans ma vraie application et donc la solution avec le CustomConverter semble beaucoup plus appropriée.

Est-ce que quelqu'un sait où le problème est dans cet exemple spécifique?

Cheers, Robert

+0

L'utilisation d'un CustomMapper est-elle une solution acceptable pour vous? – Akah

+0

La solution utilisant un CustomMapper fonctionne et est correcte. Cependant, je pense que la solution esquissée ci-dessus serait plus simple et plus facile à maintenir à long terme. En outre, je suis curieux de savoir si ce comportement est intentionnel ou non. – Robert

+0

Ce serait une bonne solution, mais je ne pense pas que les convertisseurs sont utilisés lorsque la source est 'null'. Un CustomMapper peut être votre seule option, mais pensez à demander au mainteneur, j'ai vérifié qu'ils étaient actifs sur une liste de diffusion Google pour le projet. – kab

Répondre

1

Le comportement observé est intentionnel. Au lieu d'utiliser un convertisseur personnalisé qui gère les valeurs nulles, il est possible de créer une ObjectFactory qui gère la création d'objet. Ici, nous pouvons définir les valeurs par défaut et les remplacer si nécessaire (c'est-à-dire si un objet non nul est mappé) dans le convertisseur personnalisé. Notez que nous avons ici à mettre

.mapNulls(false) 

pour que cela fonctionne.

Merci à Elaatifi de Orika pour cette solution!