1

我一直在使用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来实现映射有关,但如果我可以在我的属性映射中使用继承会很好。你知道怎么做吗?

4

2 回答 2

1

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

这种映射继承目前是不可能的。

所以我想我必须在子类中实现所有转换

于 2017-01-13T11:54:57.137 回答
0

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

在查看了一些帖子和搜索答案后,我发现了这个帖子 问题发生是因为“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:对不起我的英语

于 2022-01-31T06:40:54.687 回答