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)
}
Как я могу создать разные экземпляры B или C в toDto зависит от значения типа?
Я использую что-то подобное
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 ответ
Если вы хотите выполнить сопоставление для полей в B
а также C
вам придется создавать методы для них. MapStruct - это генерация кода, поэтому он ничего не знает о типах среды выполнения.
Ваш текущий подход - это путь к тому, что вы ищете. Я не думаю, что с помощью ObjectFactory
могу помочь вам Единственный способ, которым вы можете помочь, - это если вы хотите нанести на карту MyEntity
на базу A
, В таком случае он будет генерировать отображение только между базой и сущностью, что не является тем, что вы ищете.
Существует открытый запрос функции ( # 131), который может сгенерировать этот экземпляр проверок для вас.