Frage

Gibt es eine Möglichkeit Sammlung Größe in Planierraupe abzubilden?

class Source {
    Collection<String> images;
}

class Destination {
  int numOfImages;
}
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top