【问题标题】:Modelmapper: Map an element in a list to field in POJOModelmapper:将列表中的元素映射到 POJO 中的字段
【发布时间】:2017-03-25 01:14:35
【问题描述】:
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 中的字段?

【问题讨论】:

    标签: java mapping dto modelmapper


    【解决方案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 (Providers documentation) 配置目标实例。

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

    使用 ModelMapper 的优点在其网站上有说明:

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

    【讨论】:

    • 谢谢!切线问题,使用 ModelMapper 与使用简单的映射器方法将一个对象转换为另一个对象的优势是什么?我认为我不必担心第三方映射器的空值检查和异常处理,但我的假设似乎是错误的。
    • @Matrix 我已经在帖子中回复了您的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2019-05-09
    相关资源
    最近更新 更多