gpt4 book ai didi

java - ModelMapper - 扁平化对象的简单方法

转载 作者:行者123 更新时间:2023-12-04 09:57:25 27 4
gpt4 key购买 nike

我有一个结构如下的源对象:

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?


仍然只需一步即可将 SourceA 转换为 Dest,就像在第一个选项中一样:
Dest dest = mapper.map(sourceA, Dest.class);

显然这是一个过于简单的例子,我的问题是创建一个映射,在某个时候我可以引用另一个映射到根 dest 对象。

最佳答案

  • 显式映射
  • 转换嵌套类并创建部分映射目标对象
  • 将剩余值映射到前一个目标对象
  • 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com