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

时间:2018-10-04 19:25:31

标签: java modelmapper

我有一个由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进行转换。< / p>

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属性?

1 个答案:

答案 0 :(得分:2)

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