ModelMapper:如何根据源中的集合是否有元素来设置目标属性

ModelMapper: How to set a destination property based on whether collection in source has elements

我有一个由 ModelMapper 管理的实体到 dto 的转换。我的规范已经修改,现在我需要在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;
}

所以,我的问题是,如何根据实体中的 Set 是否具有仅使用 ModelMapper API 的元素来设置 DTO 的布尔值 hasFoos 属性?

您可以设置 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));