Frage
Gibt es eine Möglichkeit Sammlung Größe in Planierraupe abzubilden?
class Source {
Collection<String> images;
}
class Destination {
int numOfImages;
}
Lösung
EDIT:. Ich habe aktualisiert meine Antwort einen benutzerdefinierten Konverter auf Feldebene zu verwenden, anstatt auf Klassenebene
Es könnte auch andere Lösungen, sondern eine Möglichkeit, dies zu tun wäre, eine verwenden Benutzerdefinierte Converter . Ich habe Getter und Setter zu Ihren Klassen hinzugefügt und schrieb den folgenden Konverter:
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!");
}
}
Dann erklären sie in einer benutzerdefinierten XML-Mapping-Datei :
<?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>
Mit diesem Setup, der folgende Test besteht erfolgreich:
@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());
}
Andere Tipps
Hier ist ein Ansatz zur Lösung dieses mit 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;
}
});
In diesem Beispiel wird ein Konverter für die Quell- und Zielklassen.
Weitere Beispiele und Dokumentationen finden Sie unter http://modelmapper.org
finden