Modelmapper: сопоставить элемент в списке с полем в POJO

public class SimpleDTO{
    private String firstElement;
    private String lastElement;
}

public class ComplexSource{
    private List<String> elementList;
}

Я попытался сопоставить его с помощьюmap().setFirstElement(source.getElementList().get(0)), но получаю сообщение об ошибке: «1) Недопустимый исходный метод java.util.List.get (). Убедитесь, что у метода нулевые параметры и он не возвращает void».

Как сопоставить элемент в списке с полем в Pojo с помощью ModelMapper или любой другой альтернативы?


person Matrix    schedule 10.11.2016    source источник


Ответы (1)


В этом случае вы не можете использовать PropertyMap. Если вы хотите отобразить его с помощью ModelMapper, вы должны использовать Converter вместо PropertyMap, как вы это делали.

Сначала ваш конвертер будет выглядеть следующим образом, где source - это ComplexSource, а SimpleDTO - пункт назначения:

Converter<ComplexSource, SimpleDTO> converter = new AbstractConverter<ComplexSource, SimpleDTO>() {
    @Override
    protected SimpleDTO convert(ComplexSource source) {
        SimpleDTO destination = new SimpleDTO();
        List<String> sourceList = source.getElementList();

        if(null != sourceList && !sourceList.isEmpty()){
            int sizeList = sourceList.size();

            destination.setFirstElement(sourceList.get(0));
            destination.setLastElement(sourceList.get(sizeList - 1));
        }

        return destination;
    }
};

Затем вам просто нужно добавить конвертер в свой экземпляр ModelMapper:

ModelMapper mapper = new ModelMapper();
mapper.addConverter(converter);

Если вы попробуете карту, она отлично работает:

ComplexSource complexSource = new ComplexSource();
complexSource.setElementList(Arrays.asList("firstElement", "lastElement"));

SimpleDTO simpleDto = mapper.map(complexSource, SimpleDTO.class);
System.out.println(simpleDto);

Вывод

SimpleDTO [firstElement = firstElement, lastElement = lastElement]


Уважайте ваш комментарий, вам нужно проверить нули, если это необходимо в вашем исходном экземпляре (в этом случае возможен нулевой указатель, если список равен нулю). Но он создает для вас целевой экземпляр, даже если вы можете настроить целевой экземпляр, как хотите, с помощью Provider (Документация поставщика).

В таких особых случаях использования, как этот, вам нужно беспокоиться о проверках на null и обработке исключений, потому что Converter я бы сказал, что это способ modelmapper отображать вручную pojos.

Преимущества использования ModelMapper описаны в его сети:

  • При правильной настройке в некоторых случаях нет необходимости делать карту вручную.
  • Он централизует отображение.
  • Он предоставляет API-интерфейс сопоставления для обработки особых случаев использования. (Это ваш случай)
  • И так далее (взгляните на его Интернет)
person Pau    schedule 11.11.2016
comment
Спасибо! Косвенный вопрос: в чем преимущество использования ModelMapper по сравнению с использованием простого метода сопоставления для преобразования одного объекта в другой? Я предполагал, что мне не придется беспокоиться о проверках на null и обработке исключений с помощью стороннего картографа, но, похоже, я ошибаюсь в своем предположении. - person Matrix; 11.11.2016
comment
@Matrix Я ответил в своем комментарии - person Pau; 12.11.2016