2012-02-16 1 views
3

У меня есть класс А, который имеет вложенный набор класса B:Преобразование вложенную коллекцию с помощью Бульдозер

public class A { 
    private Set<B> children; 
} 

public class B { 
    private int value; 
} 

Я также есть класс C, который имеет вложенный набор класса D:

public class C { 
    private Set<D> children; 
} 

public class D { 
    private int value; 
} 

Теперь, учитывая список A, как его преобразовать в список C? В идеале мне не нужно указывать какие-либо подсказки, поскольку я использую generics. Например:

List<A> src = new ArrayList<A>(); 
// ----- Add some A's to src ----- 
List<C> dst = mapper.map(src, List<C>.class); 

Очевидно, что синтаксис последней строки неверен. Что это должно быть? Также как сообщить Dozer, какой тип списка или набора создать?

Спасибо.

Naresh

+0

Вы когда-нибудь это выясняли? –

+0

@MatthewSmith См. Мой ответ ниже –

ответ

0

Вы должны просто расширить этот список Перекодировка. Dozer конвертирует JavaBeans и такие объекты, а не коллекции. Итак, если вы хотите передать коллекции, вы можете создать обертку, такую ​​как

public class EntityConverter { 
    private Mapper mapper; 

    public EntityConverter(Mapper mapper) { 
     this.mapper = mapper; 
    } 

    public <F, T> List<T> convert(List<F> fromList, final Class<T> toClass) { 
     return Lists.transform(fromList, new Function<F, T>() { 
      @Override 
      public T apply(F from) { 
       return convert(from, toClass); 
      } 
     }); 
    } 

    public <F, T> T convert(F from, final Class<T> toClass) { 
     if (from == null) return null; 
     return mapper.map(from, toClass); 
    } 
} 

Примечание: Этот код используется в Guava.

3

Это на самом деле ответило на их часто задаваемые вопросы, но по какой-то причине это далеко не так. Я не думаю, что это продвинутая тема, я думаю, что это обычное дело. You do it with a collection hint.

При сопоставлении коллекций, как сообщить Dozer, какие типы объектов данных я хочу получить в коллекции назначения?

Подсказки поддерживаются до ручкой этого прецедента. Подсказки не требуются, если вы используете JDK 1.5 Generics, поскольку типы могут быть автоматически обнаружены с помощью Dozer. Но если вы не используете generics, чтобы преобразовать Collection/Array в коллекцию/массив с разными объектами типа, вы можете указать подсказку до , чтобы позволить Dozer узнать, какой тип объектов вы хотите создать в списке адресатов . Если подсказка не указана для поля назначения , то коллекция назначения будет заполнена объектами , которые являются тем же самым типом, что и элементы в коллекции src.

<field> 
    <a>someList</a> 
    <b>otherList</b> 
    <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> 
</field> 

Этот ответ показывает вам, как сделать это в XML. Вот как вы можете это сделать в Java код с Mapping:

import org.dozer.loader.api.BeanMappingBuilder; 

import static org.dozer.loader.api.FieldsMappingOptions.hintB; 

public class Mapping extends BeanMappingBuilder { 
    @Override 
    protected void configure() { 
     mapping(Subject.class, JsonSubject.class) 
       .fields("names", "names", hintB(JsonName.class)); 
    } 
} 

Подсказка говорит бульдозер, «этот список должны быть преобразованы в список JsonName экземпляров». Вот как вы добавляете это сопоставление в свой картограф:

mapper = new DozerBeanMapper(); 
    mapper.addMapping(new Mapping()); 
+0

Работал точно так, как предполагалось. Я использую это в dropwizard для преобразования POJO домена в представления и имеет вложенные представления. Вы будете осторожны с вашей ленивой + нетерпеливой нагрузкой, но dozer несет все, что вам нужно, и будет использовать ваши вложенные представления с этим намеком. – gspatel

 Смежные вопросы

  • Нет связанных вопросов^_^