如何在ModelMapper的PropertyMap中使用继承

时间:2017-01-13 11:33:06

标签: java inheritance reflection modelmapper

我一直在使用ModelMapperIdentity个对象(实体)转换为DTO个对象。我想在所有实体(GenericEToDtoPropertyMap)的泛型类中实现泛型属性转换,并在每个实体的单独子类中实现显式属性转换(实体PersonEToDTOPropertyMapPerson)。为了更清楚,这是我的代码:

通用属性映射:

public class GenericEToDtoPropertyMap<E extends Identity, DTO extends PersistentObjectDTO> extends PropertyMap<E, DTO> {

  @Override
  protected void configure() {
    // E.oid to DTO.id conversion
    map().setId(source.getOid());
  }

}

实体Person的特定属性映射:

public class PersonEToDTOPropertyMap extends GenericEToDtoPropertyMap<Person, PersonDTO> {

  @Override
  protected void configure() {
    super.configure();
    // implement explicit conversions here
  }

}

使用属性映射:

modelMapper = new ModelMapper();
Configuration configuration = modelMapper.getConfiguration();
configuration.setMatchingStrategy(MatchingStrategies.STRICT);
modelMapper.addMappings(new PersonEToDTOPropertyMap());
// convert person object
PersonDTO personDto = modelMapper.map(person);

问题是通用转换不适用。在我的情况下,person.oid不会被复制到personDto.id。只有删除部件才能正常工作:

map().setId(source.getOid());

来自GenericEToDtoPropertyMap.configure()方法并将其放入PersonEToDTOPropertyMap.configure()方法。

我想,它与ModelMapper使用Reflection实现映射有关,但如果我可以在属性映射中使用继承,那将会很好。你知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

我刚刚找到void MyReplaceFunction(char& c) { static const int delta='A'-'1'; if(c>='A' && c<='Z') { c-=delta; } } std::for_each(str.begin(), str.end(), MyReplaceFunction); 的创建者, Jonathan Halterman 的答案: https://groups.google.com/forum/#!topic/modelmapper/cvLTfqnHhqQ

  

目前无法进行这种映射继承。

所以我想我必须在子类

中实现所有转换