4
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。”

如何使用 ModelMapper 或任何其他替代方法将列表中的元素映射到 Pojo 中的字段?

4

1 回答 1

5

在这种情况下,您不能使用PropertyMap. 如果你想使用它来映射它,ModelMapper你必须使用 aConverter而不是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]


尊重您的评论,您需要检查源实例中是否需要空值(在这种情况下,如果列表为空,则可能是空指针)。但它会为您初始化目标实例,即使您可以使用ProviderProviders 文档)配置目标实例。

在这种特殊用例的情况下,您需要担心 null 检查和异常处理,因为Converter我想说的是 modelmapper 手动映射 pojos 的方式。

使用 ModelMapper 的优点在其网站上进行了解释:

  • 如果您在某些情况下正确配置它,则无需手动进行映射。
  • 它集中映射。
  • 它提供了一个用于处理特殊用例的映射 API。(这是你的情况)
  • 等等(看看它的网页
于 2016-11-11T05:50:04.857 回答