【问题标题】:MapStruct map correct instance of object based on target typeMapStruct 根据目标类型映射正确的对象实例
【发布时间】:2018-11-20 23:10:34
【问题描述】:

如何正确映射具有相同父级的不同类

spring DTO jackson 对象

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type",
    )
@JsonSubTypes(value = {
            @JsonSubTypes.Type(value = B.class, name = "TypeB"),
            @JsonSubTypes.Type(value = C.class, name = "TypeC")
})
abstract class A {
   Type type;
   String id;
}


class B extends A {
    String name;  
}


class C extends A {
   String description;
}

实体类包含所有字段

class myEntity {
    Type type;
    String id;
    String name;  
    String description;
} 

MapStruct 映射器

public abstract class IntegrationMapper  {
    public A toDto(MyEntity myEntity);
    public MyEntity fromDto(A integrationDTO)  
}

如何在 toDto 中创建不同的实例 B 或 C 取决于 type 值?

我就是这么用的

public abstract class IntegrationMapper {
    public A toDto(MyEntity myEntity) {
        if(myEntity.type == TypeB) {
            return toB(myEntity);
        } else if (myEntity.type == TypeC) {
            return toC(myEntity);            
        }
    }

    public MyEntity fromDto(A a)  {
        if(a instanceOf B) {
            return fromDto((B) a);
        } else if (a instanceOf C) {
            return fromDto((C) a);
        }
    }

    protected B toB(MyEntity myEntity);
    protected C toC(MyEntity myEntity);

    protected MyEntity fromDto(B c);
    protected MyEntity fromDto(C c);

}

但我怀疑使用 ObjectFactory 或类似的东西可以做得更好

避免长 if 语句 并为 A

的每个新子级创建新方法

【问题讨论】:

    标签: java spring jackson jackson2 mapstruct


    【解决方案1】:

    如果您想为BC 中的字段执行映射,您必须为它们创建方法。 MapStruct 是一种代码生成,因此它对运行时类型一无所知。

    您当前的方法是您正在寻找的方法。我不认为使用ObjectFactory 可以帮助你。它可以帮助您的唯一方法是如果您想将MyEntity 映射到基础A。在这种情况下,它只会在基础和实体之间生成映射,这不是您要寻找的。​​p>

    有一个开放的功能请求 (#131) 可以为您生成这些检查实例。

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2018-04-02
      • 2021-02-17
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多