Modelmapper:将列表中的元素映射到 POJO 中的字段

Mat*_*rix 4 java mapping dto modelmapper

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

public class ComplexSource{
    private List<String> elementList;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用映射它,map().setFirstElement(source.getElementList().get(0))但收到错误消息“1) 无效的源方法 java.util.List.get()。确保该方法有零个参数并且不返回 void。”

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

Pau*_*Pau 6

在这种情况下,您不能使用PropertyMap. 如果您想使用它进行映射,ModelMapper则必须使用 aConverter而不是像PropertyMap您所做的那样。

首先,您的转换器将是下一个,并且source是目的地:ComplexSourceSimpleDTO

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后您只需将转换器添加到您的ModelMapper实例中:

ModelMapper mapper = new ModelMapper();
mapper.addConverter(converter);
Run Code Online (Sandbox Code Playgroud)

如果你尝试一下地图,它会完美地工作:

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

SimpleDTO simpleDto = mapper.map(complexSource, SimpleDTO.class);
System.out.println(simpleDto);
Run Code Online (Sandbox Code Playgroud)

输出

SimpleDTO [firstElement=firstElement, lastElement=lastElement]


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

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

使用 ModelMapper 的优点在其网站上有解释:

  • 如果在某些情况下配置正确,则无需手动进行映射。
  • 它集中了映射。
  • 它提供了用于处理特殊用例的映射 API。(这是你的情况)
  • 等等(看看它的网站