如何使用相同的父级
更正地映射不同的类春天 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 的每个新孩子创建新方法
答案 0 :(得分:0)
如果要对B
和C
中的字段执行映射,则必须为它们创建方法。 MapStruct是代码生成,因此它对运行时类型一无所知。
您目前的方法是找到您想要的方法。我不认为使用ObjectFactory
可以帮助你。它可以帮助您的唯一方法是,如果您想将MyEntity
映射到基础A
。在这种情况下,它将仅在基础和实体之间生成映射,这不是您正在寻找的。 p>
有一个开放式功能请求(#131)可以为您生成这些支票实例。