2017-06-20 5 views
1

Orika a un ensemble de "BuiltinConverters"Est-il possible de remplacer le convertisseur intégré d'Orika - XMLGregorianCalendar en java.util.Date?

https://github.com/orika-mapper/orika/blob/master/core/src/main/java/ma/glasnost/orika/converter/builtin/BuiltinConverters.java

Mais celui qui XMLGregorianCalendar cartes à java.util.Date ne fonctionne pas correctement pour moi. J'ai découvert la façon de le mapper avec un résultat satisfaisant, mais je n'arrive pas à trouver un moyen de faire en sorte qu'Orika l'utilise à la place de son propre convertisseur intégré. J'ai essayé l'enregistrement du convertisseur MapperDefinition:

public class MapperDefinition { 

    private final MapperFactory factory; 
    private final ConverterFactory converterFactory; 

    public MapperDefinition() { 

    factory = new DefaultMapperFactory.Builder().build(); 
    converterFactory = factory.getConverterFactory(); 

    converterFactory.registerConverter(new CustomConverter<XMLGregorianCalendar, Date>() { 
     @Override 
     public Date convert(XMLGregorianCalendar source, Type<? extends Date> destinationType) { 
     LocalDateTime ldt = LocalDateTime.of(source.getYear(), source.getMonth(), 
      source.getDay(), source.getHour(), source.getMinute(), source.getSecond()); 
     return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); 
     } 
    } 
    } 

} 

Mais le débogage montre que Orika semble ignorer mon convertisseur personnalisé et utilise toujours son propre convertisseur intégré. Je ne peux pas trouver toutes les informations sur le remplacement sur Orika Guide de l'utilisateur:

https://orika-mapper.github.io/orika-docs/converters.html

Est-ce que quelqu'un sait s'il est possible de faire Orika utiliser ma façon de cartographier ces deux types?

+0

Je suppose que votre code enregistre votre convertisseur dans cette usine spécifique, mais une usine de mappage peut renvoyer des usines distinctes dans certains cas. Êtes-vous sûr que votre application utilise l'usine dans laquelle vous vous êtes inscrit? –

Répondre

1

J'ai trouvé la réponse moi-même. En fait, le convertisseur intégré est un "BidirectionalConverter" et j'ai utilisé "CustomConverter", parce que je voulais seulement changer la cartographie d'une façon: XML -> Date. Le changer en bidirectionnel a résolu le problème.

+0

Que le convertisseur bidirectionnel ou non ne soit pas important pour la conversion unidirectionnelle, l'usine doit toujours utiliser ce qu'elle a configuré. Vous avez une solution de contournement qui fonctionne via certains effets secondaires, semble-t-il. –

0

Je pense que vous voudrez peut-être signaler un problème aux gars d'Orika, afin qu'ils puissent résoudre le problème avec leur builtin ou le faire de sorte que leurs builtins ne remplacent pas les convertisseurs personnalisés que vous enregistrez. Pour contourner le problème, je vous suggère de désactiver l'utilisation des intégrations sur le générateur et d'enregistrer les convertisseurs internes uniquement après avoir enregistré tous vos convertisseurs et remplacements personnalisés. Cela devrait (au moins en juger par la façon dont leur DefaultConverterFactory fonctionne actuellement) donner à vos convertisseurs personnalisés la priorité nécessaire pour supprimer les builtins.

Le code:

factory = new DefaultMapperFactory.Builder() 
    .useBuiltinConverters(false) 
    .build(); 
converterFactory = factory.getConverterFactory(); 

converterFactory.registerConverter(<... Your converter here ...>); 

BuiltinConverters.register(converterFactory);