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), который может сгенерировать этот экземпляр проверок для вас.

Другие вопросы по тегам