Настройте ModelMapper для сопоставления вложенного объекта с полем

Вот мои 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. Это возможно?

2 ответа

Конфигурация:

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)

Версия ModelMapper: 1.1.0

Ps Вы можете организовать свой код, похожий на мой ответ в другом вопросе.

Для такого типа отображения предпочтительно использовать AnnotationProcessor, такой как mapStuct, который уменьшает код.

Это сгенерирует код для 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

Другие вопросы по тегам