2013-11-13 3 views
0

Orika поддерживает общие типы, но у меня проблемы с его работой с коллекциями. Поскольку Orika не поддерживает разные стратегии сбора (кумулятивное, не кумулятивное, сиротское удаление), мне нужно написать собственный сопоставитель для обработки моих требований.Orika Generic Collection Пользовательское сопоставление

Проблема в том, что Orika не применяет этот сопоставление, а вместо этого пытается использовать обычную логику отображения коллекции.

Type<List<Document>> DOCUMENT_LIST = new TypeBuilder<List<Document>>() {}.build(); 
Type<List<DocumentRepresentation>> DOCUMENT_REP_LIST = new TypeBuilder<List<DocumentRepresentation>>() {}.build(); 

mapperFactory.classMap(DOCUMENT_LIST, DOCUMENT_REP_LIST) 
       .mapNulls(true) 
       .mapNullsInReverse(true) 
       .customize(new NonCumulativeListMapperDocumentToDocumentRepresentation()) 
       .register(); 

public class NonCumulativeListMapperDocumentToDocumentRepresentation 
     extends CustomMapper<List<Document>, List<DocumentRepresentation>> { 
    //mapping logic 
} 

Я также попытался явно устанавливая список типов в родительских отображений

.fieldMap("documents", "documents") 
.aElementType(Document.class) 
.bElementType(DocumentRepresentation.class) 
.add() 

, но это также не забирается.

Любые намеки на то, что мне не хватает?

+0

map 'Document' to' DocumentRepresentation' и использовать 'mapAsCollection'? –

+0

@RC Мне нужно иметь доступ к обоим спискам и выполнять сопоставление из списка A в список B самостоятельно. У Dozer была 'FieldsMappingOptions.collectionStrategy (true, RelationshipType.NON_CUMULATIVE)', тогда как Orika использует только addAll из того, что я видел. Вот почему я реализовал логику в пользовательском сопоставлении. –

ответ

1

Это может быть сделано путем регистрации пользовательский картографа:

mapperFactory.registerMapper(new NonCumulativeListMapperDocumentToDocumentRepresentation()); 

И это будет использоваться позже, когда Orika должны карту DOCUMENT_LIST DOCUMENT_REP_LIST. Последняя конфигурация FieldMap не нужна.

Для получения дополнительной информации о слиянии коллекций в Орика, пожалуйста, обратитесь к этому simple test (CustomMergerTest).

+0

чем разница в 'mapperFactory.classMap (DOCUMENT_LIST, DOCUMENT_REP_LIST) .mapNulls (истина) .mapNullsInReverse (истина) .customize (новый NonCumulativeListMapperDocumentToDocumentRepresentation()) .register();' –

+0

При регистрации classmap это сказать Orika для создания нового Mapper с настраиваемой частью (NonCumulativeListMapperDocumentToDocumentRepresentation), но это останется лишь частью процесса сопоставления. Второй расскажет Orika, что он просто использует данный картограф, и возвращает вам контроль над процессом отображения между двумя коллекциями, я думаю, это то, что вам нужно для реализации желаемого поведения. –

+0

Ок, я понимаю, но мне интересно, почему опция '.mapper()' как '.converter()' для fieldMap отсутствует. Или существует другой способ ограничить настраиваемый сопоставитель только некоторыми сопоставлениями полей? –

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