MapStruct отображает правильный экземпляр объекта на основе целевого типа - PullRequest
0 голосов
/ 11 июня 2018

Как исправить карту разных классов с одним и тем же родителем

пружина 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 зависит от type значение?

Я использую что-то вроде этого

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 или чего-то подобного

, чтобы избежать длинных , еслиоператор и создание нового метода для каждого нового потомка A

1 Ответ

0 голосов
/ 11 июня 2018

Если вы хотите выполнить сопоставление для полей в B и C, вам нужно будет создать методы для них.MapStruct является генерацией кода, поэтому он ничего не знает о типах среды выполнения.

Ваш текущий подход - это путь к тому, что вы ищете.Я не думаю, что использование ObjectFactory может вам помочь.Единственный способ помочь вам - это если вы хотите сопоставить MyEntity с базой A.В этом случае он будет генерировать сопоставление только между базой и сущностью, что не является тем, что вы ищете.

Существует открытый запрос объекта ( # 131 ), который может генерировать теэкземпляр чека для вас.

...