提问者:小点点

Mapstruct根据目标类型映射正确的对象实例


如何更正具有相同父级的不同类

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

映射器

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

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

我用这样的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或类似的smth可以做得更好

为了避免长if语句和为


共1个答案

匿名用户

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

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

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