我有一个具有如下结构的源对象:
class SourceA {
int www;
SourceB sourceB;
}
class SourceB {
int xxx;
int yyy;
int zzz;
}
目的地:
class Dest {
int aaa;
int bbb;
int ccc;
int ddd;
}
这是配置映射的最直接方法:
ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(SourceA.class, Dest.class)
.addMapping(SourceA::getWww, Dest::setDdd)
.addMapping(src -> src.getSourceB().getXxx(), Dest::setAaa)
.addMapping(src -> src.getSourceB().getYyy(), Dest::setBbb)
.addMapping(src -> src.getSourceB().getZzz(), Dest::setCcc);
但我想做这样的事情:
ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(SourceB.class, Dest.class)
.addMapping(SourceB::getXxx, Dest::setAaa)
.addMapping(SourceB::getYyy, Dest::setBbb)
.addMapping(SourceB::getZzz, Dest::setCcc);
mapper.createTypeMap(SourceA.class, Dest.class)
.addMapping(SourceA::getWww, Dest::setDdd)
.addMapping(SourceA::getSourceB, ???); // How to reference self here?
并且仍然只需 1 步即可将 SourceA 转换为 Dest,就像第一个选项一样:
Dest dest = mapper.map(sourceA, Dest.class);
显然这是一个过于简化的示例,我的问题是创建一个映射,在某个时刻我可以引用另一个映射到根目标对象。
最佳答案
- 显式映射
- 转换嵌套类并创建部分映射的目标对象
- 将剩余值映射到前一个目标对象
public static void main(String[] args) {
ModelMapper createTypeMap = new ModelMapper();
SourceA sourceA = new SourceA();
SourceB sourceB = new SourceB();
sourceB.setXxx(1);
sourceB.setYyy(2);
sourceB.setZzz(3);
sourceA.setWww(4);
sourceA.setSourceB(sourceB);
Dest dest = createTypeMap.createTypeMap(SourceB.class, Dest.class)
.addMapping(SourceB::getXxx, Dest::setAaa)
.addMapping(SourceB::getYyy, Dest::setBbb)
.addMapping(SourceB::getZzz, Dest::setCcc)
.map(sourceB);
createTypeMap.createTypeMap(SourceA.class, Dest.class)
.addMapping(SourceA::getWww, Dest::setDdd)
.map(sourceA, dest);
System.out.println(dest);
}
- 隐式映射,您可以使用以下解决方法之一
- 向目标对象添加 setter 以匹配源字段
class Dest {
int xxx;
int bbb;
int ccc;
int ddd;
public void setWWW(final int xxx) {
this.xxx = xxx;
}
public void setXXX(final int aaa) {
this.aaa = aaa;
}
public void setYYY(final int bbb) {
this.bbb = bbb;
}
public void setZZZ(final int ccc) {
this.ccc = ccc;
}
}
- 或者更改目标或源字段名称以相互匹配
然后使用以下配置和映射
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
dest = modelMapper.map(sourceA, Dest.class);
System.out.println(dest);
输出
Dest{aaa=1, bbb=2, ccc=3, ddd=4}
关于java - ModelMapper - 平坦对象的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61894864/