Existe-t-il un moyen de cartographier la taille de la collection dans un bulldozer?Taille de la collection de cartes dans Dozer
class Source {
Collection<String> images;
}
class Destination {
int numOfImages;
}
Existe-t-il un moyen de cartographier la taille de la collection dans un bulldozer?Taille de la collection de cartes dans Dozer
class Source {
Collection<String> images;
}
class Destination {
int numOfImages;
}
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());
}
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
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 –
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 :) –