Mapstruct отображает одно поле на несколько целевых полей и наоборот - PullRequest
0 голосов
/ 17 сентября 2018

Я передал вопрос Сопоставьте несколько исходных полей с целевыми полями одного и того же типа с помощью Mapstruct , но это не помогает

Мои остальные классы ресурсов, как показано ниже

class Base {
//fields
//getters and setters
}

Class A extends Base{
List<String> emailAdddress;
//other fields
//getters and setters
}

Class B extends Base{
List<String> devices;
//other fields
//getters and setters
}

Class C extends Base{
List<String> mobileNumbers;
//other fields
//getters and setters
}

Мой класс сущности - Source, как показано ниже:

 Class Source {
    String address
    //other fields
    //getters and setters
    }

Я хочу сопоставить адрес из класса Source с emailAdddress или устройствами или mobileNumbers в своем классе сопоставления, я попытался использовать @AfterMapping в сопоставителекласс, а также класс декоратора, но это не помогло.

У меня есть такой класс сопоставления

@Mapper
public abstract class AddressMapper {
     //basic mappings here

public abstract Source toEntity(Base b);
public abstract Base toDomain(Source src);

   @AfterMapping 
   public void setAddressInfo(@MappingTarget Source src, B b) {
        src.setAddress(b.getDevices().toString());
}

1 Ответ

0 голосов
/ 17 сентября 2018

Я не уверен, что полностью понимаю, что вы пытаетесь сделать.

Однако, если вы хотите отобразить определенные классы (A, B, C, вам необходимо поместить их в методы. Поскольку MapStruct является процессором аннотаций и во время компиляции он знает только о Base полей в вашем примере. Что вы можете сделать, это что-то вроде следующего:

@Maper
public interface AdressMapper {


    default Source toEntity(Base b) {
        if (b == null) {
            return null;
        } else if (b instanceOf A) {
            toEntity((A) b);
        } else if (b instanceOf B) {
            toEntity((A) b);
        } else if (b instanceOf C) {
            toEntity((C) b);
        } else {
            // Decide what to do
        }
    }

    @Mapping(target = "address", source = "emailAddress")
    Source toEntity(A a);

    @Mapping(target = "address", source = "devices")
    Source toEntity(B b);

    @Mapping(target = "address", source = "mobileNumbers")
    Source toEntity(C c);

    default Base toDomain(Source source) {
        if (source == null) {
            return null;
        } else if (condition to match to A) {
            return toDomainA(source);
        } else if (condition to match to B) {
            return toDomainB(source);
        } else if (condition to match to C) {
            return toDomainC(source);
        }
    }

    @Mapping(target = "emailAddress", source = "address")
    A toDomainA(Source source);

    @Mapping(target = "devices", source = "address")
    B toDomainB(Source source);

    @Mapping(target = "mobileNumbers", source = "address")
    C toDomainB(Source source);


    // This method is needed so MapStruct knows how to map from List<String> into String
    static <T> String listToString(List<T> list) {
        if (list == null) {
            return null;
        }

        return list.toString();
    }

    // This method is needed so MapStruct know hot to map from String into List<String>
    static List<String> fromListToString(String string) {
        if (string == null) {
            return null;
        }

        // Perform your own conversion
    }
}
...