3

我有以下课程:

public class MyEntity {
  private Set<MyOtherEntity> other;
}

public class MyDTO {
  private List<MyOtherDTO> other;
}

我创建了两个PropertyMaps(使用ModelMapper),一个用于从 DTO 到 DTO 的每次转换

public class DTOToEntityPropertyMap extends PropertyMap<MyDTO, MyEntity> {
  @Override
  protected void configure() {
    List<MyOtherDTO> myOtherDTOs = source.getOther();
    Set<MyOtherEntity> myOtherEntities = new HashSet<>();
    for (MyOtherDTO myOtherDTO : myOtherDTOs) {
      MyOtherEntity myOtherEntity = ModelMapperConverterService.convert(myOtherDTO, MyOtherEntity.class);
      myOtherEntities.add(myOtherEntity);
    }
    map().setOther(myOtherEntities);
  }
}

public class EntityToDTOPropertyMap extends PropertyMap<MyEntity, MyDTO> {
  @Override
  protected void configure() {
    Set<MyOtherEntity> myOtherEntities = source.getOther();
    List<MyOtherDTO> myOtherDTOs = new ArrayList<>();
    for (MyOtherEntity myOtherEntity : myOtherEntities) {
      MyOtherDTO myOtherDTO = ModelMapperConverterService.convert(myOtherEntity, MyOtherDTO.class);
      myOtherDTOs.add(myOtherDTO);
    }
    map().setOther(myOtherDTOs);
  }
}

添加PropertyMapsModelMapper创建以下错误:

引起:org.modelmapper.ConfigurationException:ModelMapper配置错误:

1) 无效的源方法 java.util.List.add()。确保该方法的参数为零并且不返回 void。

我想我不能List.add()PropertyMap.

那么,实现 List 到 Set 和向后转换的最佳方法是ModelMapper什么?

4

1 回答 1

4

必须使用PropertyMap它来映射属性。如果你放一些不同的逻辑,它会抛出一个异常。

所以,你有下一个选择(我把例子放在一个方向,另一个是相同的):

选项 1:确保 PropertyMap 匹配属性

使用属性映射并确保 ModelMapper 会使用它,看看Matching Strategies的规则:

  • 标准:默认。
  • 松动的
  • 严格的

使用能确保您的房产列表other与目的地房产相匹配的那个other。例如,如果您使用 Strict Strategy 并且顺序不正确,它将无法匹配。

然后,如果您确定该属性将匹配 ModelMapper 将按照其规则为您映射该属性,或者如果您需要它,您将能够创建一个PropertyMapMyOtherEntity和目标MyOtherDTO并将其添加到您的ModelMapper实例中。

public class DTOToEntityPropertyMap extends PropertyMap<MyOtherEntity, MyOtherDTO> {
  @Override
  protected void configure() {
    map().setPropertyOfOther(source.getPropertyOfOther());
    //and so on...
  }
}

modelMapper.addMappings(new DTOToEntityPropertyMap());

注意:如果您的父映射(在您的情况下为 MyEntity 到 MyDto)有其他映射,则您需要在父映射PropertyMap之前添加列表类的 PropertyMapping,否则它不会使用此属性映射。

选项 2:创建列表转换器并使用它

其他选项是创建列表类的转换器(MyOtherEntity -> MyOtherDto)并在父 PropertyMap 中使用它。

Converter<Set<MyOtherEntity> , List<MyOtherDto>> toOtherDto = new Converter<Set<MyOtherEntity> , List<MyOtherDto>>() {
  public String convert(MappingContext<Set<MyOtherEntity> , List<MyOtherDto>> context) {
    Set<MyOtherEntity> source = context.getSource();
    List<MyOtherDto> destination = context.getDestination();
    //Convert it using the logic you want (by hand for example)

    return destination;
  }
};

然后你必须在你的 Parent 中使用它PropertyMap,如下所示:

public class EntityToDTOPropertyMap extends PropertyMap<MyEntity, MyDTO> {

  Converter<Set<MyOtherEntity> , List<MyOtherDto>> toOtherDto = new Converter<Set<MyOtherEntity> , List<MyOtherDto>>() {
    public String convert(MappingContext<Set<MyOtherEntity> , List<MyOtherDto>> context) {
      Set<MyOtherEntity> source = context.getSource();
      List<MyOtherDto> destination = context.getDestination();
      //Convert it using the logic you want (by hand for example)

      return destination;
    }
  };

  @Override
  protected void configure() {
    using(toOtherDto).map(source.getOther()).setOther(null);
  }
}

然后确保将此 PropertyMap 添加到您的 ModelMapper 实例中:

modelMapper.addMappings(new EntityToDTOPropertyMap());
于 2017-01-18T08:20:10.797 回答