ModelMapper: Как установить свойство назначения в зависимости от того, имеет ли коллекция в источнике элементы - PullRequest
0 голосов
/ 04 октября 2018

У меня есть объект для преобразования в dto, который управляется ModelMapper.Моя спецификация была изменена, и теперь мне нужно добавить логическое свойство в DTO, определяющее, есть ли у коллекции в сущности элементы.

Итак, если моя сущность выглядит примерно так:

public class MyEntity {
  private Integer id;
  private String someField;
  @OneToMany
  private Set<Foo> foos;
  private Date createdDate;
  private Date modifiedDate;
  private Integer version;

  // getters & setters
}

и мой обновленный DTO выглядит примерно так:

public class MyEntityDto {
  private Integer id;
  private String someField;
  private Boolean hasFoos;

  // getters & setters
}

Я преобразую из сущности в DTO в потоке:

public List<MyEntityDto> convert(List<MyEntity) l) {
  return l.stream
    .map(this::toDto)
    .collect(Collectors.toList());
}

Чтобы соответствовать обновленной спецификации, я изменил toDtoметод добавления логического значения вручную, но я не совсем доволен им и предпочел бы конвертировать в ModelMapper, хотя бы в качестве учебного упражнения.

private MyEntityDto toDto(MyEntity e ) {
    MyEntityDto dto =  modelMapper.map(e, MyEntityDto.class);
    dto.setHasFoos(e.foos.size() > 0);
    return dto;
}

Итак, мой вопрос, как я могуустановить логическое свойство hasFoos DTO в зависимости от того, есть ли у элемента в сущности элементы, использующие только API ModelMapper?

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете настроить typeMap для преобразования определенных полей классов с вашими собственными конвертерами.

ModelMapper modelMapper = new ModelMapper();
Converter<Set, Boolean> SET_TO_BOOLEAN_CONVERTER =
        mappingContext -> !mappingContext.getSource().isEmpty();

modelMapper.createTypeMap(MyEntity.class, MyEntityDto.class)
    .addMappings(mappings -> mappings.using(SET_TO_BOOLEAN_CONVERTER)
                            .map(MyEntity::getFoos, MyEntityDto::setHasFoos));
...