1

这是我的 DTO:

public class TagVolumeDTO {
    private Long id;
    private Long idTag;
    //...
}

public class TagTDO {
    private Long id;
    private Long amount;
    //...
}

这是我的实体:

public class TagVolume {
    private Long id;
    private Tag tag;
    //...
}

public class Tag {
    private Long id;
    private Long amount;
    //...
}

我想将我的 ModelMapper 配置为将 Tag#id 映射到 TagVolumeDTO#idTag。那可能吗?

4

2 回答 2

4

配置:

ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
mapper.typeMap(TagVolume.class, TagVolumeDTO.class)
        .addMappings(m -> m.map(src -> src.getTag().getId(), TagVolumeDTO::setIdTag));

用法:

Tag tag = new Tag();
tag.setId(1L);
tag.setAmount(10L);
TagVolume tagVolume = new TagVolume();
tagVolume.setId(123L);
tagVolume.setTag(tag);
System.out.println(mapper.map(tagVolume.getTag(), TagDTO.class));
System.out.println(mapper.map(tagVolume, TagVolumeDTO.class));

输出:

TagDTO(id=1, 金额=10)

TagVolumeDTO(id=123, idTag=1)

模型映射器版本:1.1.0

Ps 你可以按照在另一个问题中的回答来组织你的代码。

于 2017-12-21T12:15:39.507 回答
2

对于这些类型的映射,最好使用像 mapStuct 这样的 AnnotationProcessor 来减少代码。

它将为 Mapper 生成代码

  @Mapper
public interface SimpleSourceDestinationMapper {
    TagVolumeDTO sourceToDestination(Tag source);
    Tag destinationToSource(TagVolumeDTO destination);
}

这些映射器的用法如下

private SimpleSourceDestinationMapper mapper
      = Mappers.getMapper(SimpleSourceDestinationMapper.class);

TagVolumeDTO destination = mapper.sourceToDestination(tag);

请找到详细实施 MapStuct的链接

于 2017-12-21T13:06:27.020 回答