Настройте 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