2009-05-13 8 views

Répondre

3

Vous ne savez pas exactement ce que vous voulez dire - si vous voulez que Dozer remplisse toujours BeanB.someField avec une constante quand vous mappez de BeanA à BeanB?

Vous souhaiterez peut-être enregistrer un custom converter pour ce mappage.

+0

Oui, c'est exactement ce que je veux. Je me demandais s'il était possible de le faire directement sans un convertisseur personnalisé. –

+0

Merci pour la réponse, soit dit en passant. –

+0

Je crois que vos seules méthodes sont d'utiliser un convertisseur personnalisé ou de le faire à la main lorsque vous invoquez Dozer. Dozer ne gère réellement que le mappage d'un bean à un autre et ne vous laisse pas beaucoup de place pour insérer une autre logique (ce qui est logique, car il n'est pas censé le faire). –

2

Pourquoi ne pas profiter du mécanisme des événements?

Donc, vous pouvez enregistrer un écouteur qui ferait le réglage de la valeur dans mappingFinished() de votre écouteur. Consultez dozer doc on events pour plus de détails. Bien sûr, vous devrez garder le code de réglage avec une sorte de condition if ... instanceof.

+0

Cela a très bien fonctionné pour moi, bien que je mette mon crochet sur preWritingDestinationValue, donc les valeurs agissent comme des valeurs par défaut, plutôt que de remplacer ce qui a déjà été mappé. – tzrlk

1

Des constructions récentes de bulldozer facilitent la tâche. Vous pouvez spécifier à la fois les convertisseurs personnalisés et, vous pouvez spécifier les paramètres de ce convertisseur pour un mappage de champ donné. Il devrait être trivial de créer un seul 'ConstantConverter' qui prendra un paramètre d'entrée et le mettra dans le champ de sortie 100% du temps.

+1

En fait, ce n'est pas si simple avec les convertisseurs personnalisés. Vous devez soit écrire un convertisseur pour toute la classe contenant le champ (ce qui va à l'encontre du but de l'utilisation de dozer) ou singe avec des solutions laides pour attacher un convertisseur à un seul champ (et ce champ n'existe que sur un seul des classes). Cela peut être une bonne approche dans certains cas (en fonction de la structure de vos objets). – Lajcik

0

C'est assez simple avec ModelMapper:

ModelMapper modelMapper = new ModelMapper(); 

modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() { 
    protected void configure() { 
    map().setSomeProperty(someConstant); 
    } 
}); 

Cet exemple les cartes someConstant-DestClass.someProperty.

Vous pouvez consulter d'autres exemples et documents à: http://modelmapper.org

0

Une implémentation possible est:

public class ConstantsCustomConvertor implements ConfigurableCustomConverter{ 

    private String pararamter; 
    @Override 
    public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {  
     return pararamter; 
    } 

    @Override 
    public void setParameter(String parameter) { 
     this.pararamter = parameter; 

    } 
} 

Exemple:

<field custom-converter-param="CONTANT_VALUE" custom-converter="org.yourcompany.ConstantsCustomConvertor"> 
    <a>a-class-dummyfieldname</a> 
    <b>b-class-fieldname</b> 
</field>  

Cette coutume Convertor est suppose que le b-classe -fieldname est de type String.

Questions connexes