java - ModelMapper - 平坦对象的简单方法

标签 java modelmapper

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

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

显然这是一个过于简化的示例,我的问题是创建一个映射,在某个时刻我可以引用另一个映射到根目标对象。

最佳答案

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

    相关文章:

    java - 通用路径 : What is winding?

    用于可选封闭的 csv 字符串的 Java 正则表达式返回意外结果

    java - Jackson 不会将 XML 文件完全解析为 JSON

    android - modelmapper 是为在 android 中使用而设计的吗?

    java - 为什么 Java Math 库没有返回 float 的函数?

    java - 如何知道什么是 glassfish - 完整的平台或网络配置文件?

    java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : You have an error in your SQL syntax;(Hibernate)

    java - 在具有相同属性名称的不同数据类型上使用 ModelMapper

    java - Modelmapper:当源对象为空时如何应用自定义映射?

    modelmapper - 使用 Modelmapper,如何映射到没有默认/无参数构造函数的类?