2009-12-18 3 views

Répondre

3

EDIT: J'ai mis à jour ma réponse à utiliser un convertisseur personnalisé au niveau du terrain au lieu d'au niveau de la classe.

Il existe peut-être d'autres solutions, mais une façon de le faire serait d'utiliser un Custom Converter. J'ai ajouté accesseurs à vos classes et écrit le convertisseur suivant:

package com.mycompany.samples.dozer; 

import java.util.Collection; 

import org.dozer.DozerConverter; 

public class TestCustomFieldConverter extends 
     DozerConverter<Collection, Integer> { 

    public TestCustomFieldConverter() { 
     super(Collection.class, Integer.class); 
    } 

    @Override 
    public Integer convertTo(Collection source, Integer destination) { 
     if (source != null) { 
      return source.size(); 
     } else { 
      return 0; 
     } 
    } 

    @Override 
    public Collection convertFrom(Integer source, Collection destination) { 
     throw new IllegalStateException("Unknown value!"); 
    } 
} 

Puis, déclare dans un custom XML mapping file:

<?xml version="1.0" encoding="UTF-8"?> 
<mappings xmlns="http://dozer.sourceforge.net" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://dozer.sourceforge.net 
      http://dozer.sourceforge.net/schema/beanmapping.xsd"> 
    <mapping> 
    <class-a>com.mycompany.samples.dozer.Source</class-a> 
    <class-b>com.mycompany.samples.dozer.Destination</class-b> 
    <field custom-converter="com.mycompany.samples.dozer.TestCustomFieldConverter"> 
     <a>images</a> 
     <b>numOfImages</b> 
    </field> 
    </mapping>   
</mappings> 

Avec cette configuration, le test suivant passe avec succès:

@Test 
public void testCollectionToIntMapping() { 
    List<String> mappingFiles = new ArrayList<String>(); 
    mappingFiles.add("com/mycompany/samples/dozer/somedozermapping.xml"); 
    Mapper mapper = new DozerBeanMapper(mappingFiles); 

    Source sourceObject = new Source(); 
    sourceObject.setImages(Arrays.asList("a", "b", "C")); 

    Destination destObject = mapper.map(sourceObject, Destination.class); 

    assertEquals(3, destObject.getNumOfImages()); 
} 
+0

Merci pour la réponse. Mais en utilisant un convertisseur personnalisé au niveau de la classe, je ne bénéficierais pas de la conversion automatique des autres champs (ma véritable 'Source' et 'Destination' sont plus riches). Néanmoins en utilisant votre exemple, je mis à exécution les 'CollectionSizeConverter' qui peut-être spécifié au niveau du terrain: .... images numOfImages

+0

En effet, il peut être préférable d'utiliser un convertisseur de terrain dans votre cas. Mais, eh bien, je suppose que vous avez l'idée :) –

0

est ici une approche pour résoudre ce avec ModelMapper:

ModelMapper modelMapper = new ModelMapper(); 
modelMapper.createTypeMap(Source.class, Destination.class).setConverter(
    new AbstractConverter<Source, Destination>() { 
     protected Destination convert(Source source) { 
     Destination dest = new Destination(); 
     dest.numOfImages = source.images.size(); 
     return dest; 
     } 
    }); 

Cet exemple utilise un convertisseur pour les classes source et destination.

D'autres exemples et documents peuvent être trouvés à http://modelmapper.org

Questions connexes