【问题标题】:How to use modelMapper to convert nested classes如何使用modelMapper转换嵌套类
【发布时间】:2019-07-22 13:43:40
【问题描述】:

我有一个简单的类,我想使用 modelMapper 映射到 DTO 类。

class Source {

    private String name;
    private String address;
    List<Thing> things;

    // getters and setters follows
    }

    class Thing {

    private String thingCode;
    private String thingDescription;

    // getters and setters
}

我想将这些转换为包含 ThingDTO 列表的 sourceDTO,例如

class sourceDTO {

    private String name;
    private String address;
    List<ThingDTO> things;

    // getters and setters.
    }

     class ThingDTO {

    private String thingCode;
    private String thingDescription;

    // getters and setters
}

如果我删除了我的 Things 列表和 ThingsDTO 列表,那么 modelmapper 使用起来很有趣,

 modelMapper.map(source, SourceDTO.class);

但我不知道如何让映射器将事物列表转换为 ThingDTO 列表。从文档中,我认为我需要创建一个扩展 PropertyMap 的映射器类,但我不知道如何配置它。

欢迎任何指向相关文档的指针

【问题讨论】:

  • 发现这很有用。感谢您发布这个问题。

标签: java modelmapper


【解决方案1】:

我认为,如果您将 ModelMapper 配置为 LOOSE 或 STANDARD,它会为您服务。

modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);

否则你可以尝试下一个:

  1. 您可以创建一个转换器,如:

    public class ListThingToThingDTOConverter implements Converter<List<Thing>, List<ThingDTO>> {
    
    
    @Override
    public List<ThingDTO> convert(MappingContext<List<Thing>, List<ThingDTO>> context) {
        List<Thing> source = context.getSource();
        List<ThingDTO> output = new ArrayList<>();
        ...
        //Convert programmatically List<Thing> to List<ThingDTO>
        ...
    
        return output;
      }}
    
  2. 然后自定义一个 Mapping Thing to ThingDTO 如下:

        public class SourceToSourceDTOMap extends PropertyMap<Thing, ThingDTO> {
              @Override
              protected void configure(){
                   using(new ListThingToThingDTOConverter()).map(source.getThings()).setThings(null);
              }
    
  3. 最后,您必须将 SourceToSourceDTOMap 添加到您的 ModelMapper 中,如下所示:

    modelMapper = new ModelMapper();
    modelMapper.addMappings(new SourceToSourceDTOMap());
    

【讨论】:

  • 我的用例略有不同。你介意看一下吗? stackoverflow.com/q/69215180/9768291
  • 谢谢你。我不知道为什么这在很多地方都没有很好地解释..这就像基本要求一样,不得不四处搜索才能找到解决方案。感谢您的回答。节省大量时间。
【解决方案2】:

您可以通过创建泛型来映射如下代码。参考链接

http://modelmapper.org/user-manual/generics/

进口:

import java.lang.reflect.Type;
import org.modelmapper.ModelMapper;
import org.modelmapper.TypeToken;

在您的服务或控制器类中:

ModelMapper modelMapper = new ModelMapper();
Type listType = new TypeToken<SourceDTO>(){}.getType();
SourceDTO sourceDTO = modelMapper.map(source,listType);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多