MapStruct根据目标类型

时间:2018-06-11 16:22:36

标签: java spring jackson jackson2 mapstruct

如何使用相同的父级

更正地映射不同的类

春天 DTO 杰克逊对象

@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 mapper

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

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

我像那样使用smth

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 的每个新孩子创建新方法

1 个答案:

答案 0 :(得分:0)

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

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

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