如何使用继承与 ModelMapper 的 PropertyMap

How to use inheritance with ModelMapper's PropertyMap

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

通用属性地图:

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());
  }

}

实体人物的特定 属性 地图:

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()方法中。

我想,这与使用 Reflection 实现映射的 ModelMapper 有关,但如果我可以在我的 属性 映射中使用继承就更好了。你知道怎么做吗?

我刚刚从 ModelMapperJonathan Halterman 的创建者那里找到了答案: https://groups.google.com/forum/#!topic/modelmapper/cvLTfqnHhqQ

This sort of mapping inheritance is not currently possible.

所以我想我必须在 child-class

中实现所有转换

5 年后......我找到了解决方案(我有同样的问题)

查看一些 post 和搜索答案后我发现了这个 问题的发生是因为方法“configure()”限制了你可以在里面做什么所以我想在外面创建一个方法获取自定义格式,这是我的代码:

public class UserMap extends PropertyMap<User,UserLoginDTO> {
    @Override
    protected void configure() {
        using(generateFullname()).
                map(source,destination.getFullName());
    }

    private Converter<User, String> generateFullname(){
        return    context -> {
            User user = context.getSource();
        return user.getName()+ " " + user.getFirstLastname() + " " + user.getSecondLastname();
    };
    }

}

因此您可以从主方法或任何需要的地方调用它,如下所示:

ModelMapper modelMapper=new ModelMapper();
modelMapper.addMappings(new UserMap());

输出为:

 UserLoginDTO{id='001', fullName='Jhon Sunderland Rex'}

你怎么看,逻辑在配置方法之外并且有效,我希望这对其他人有帮助

pd:对不起我的英语