在这种情况下,您不能使用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]
尊重您的评论,您需要检查源实例中是否需要空值(在这种情况下,如果列表为空,则可能是空指针)。但它会为您初始化目标实例,即使您可以使用Provider
(Providers 文档)配置目标实例。
在这种特殊用例的情况下,您需要担心 null 检查和异常处理,因为Converter
我想说的是 modelmapper 手动映射 pojos 的方式。
使用 ModelMapper 的优点在其网站上进行了解释:
- 如果您在某些情况下正确配置它,则无需手动进行映射。
- 它集中映射。
- 它提供了一个用于处理特殊用例的映射 API。(这是你的情况)
- 等等(看看它的网页)