如何使用继承与 ModelMapper 的 PropertyMap
How to use inheritance with ModelMapper's PropertyMap
我一直在使用 ModelMapper
将 Identity
个对象(实体)转换为 DTO
个对象。我想在所有实体 (GenericEToDtoPropertyMap
) 的通用 class 中实现通用 属性 转换,并在每个实体的单独子 class 中实现显式 属性 转换(实体 Person
的 PersonEToDTOPropertyMap
)。为了更清楚,这是我的代码:
通用属性地图:
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
有关,但如果我可以在我的 属性 映射中使用继承就更好了。你知道怎么做吗?
我刚刚从 ModelMapper
、Jonathan 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:对不起我的英语
我一直在使用 ModelMapper
将 Identity
个对象(实体)转换为 DTO
个对象。我想在所有实体 (GenericEToDtoPropertyMap
) 的通用 class 中实现通用 属性 转换,并在每个实体的单独子 class 中实现显式 属性 转换(实体 Person
的 PersonEToDTOPropertyMap
)。为了更清楚,这是我的代码:
通用属性地图:
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
有关,但如果我可以在我的 属性 映射中使用继承就更好了。你知道怎么做吗?
我刚刚从 ModelMapper
、Jonathan Halterman 的创建者那里找到了答案:
https://groups.google.com/forum/#!topic/modelmapper/cvLTfqnHhqQ
This sort of mapping inheritance is not currently possible.
所以我想我必须在 child-class
中实现所有转换5 年后......我找到了解决方案(我有同样的问题)
查看一些 post 和搜索答案后我发现了这个
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:对不起我的英语