MapStruct: отображение нескольких исходных полей в одно целевое поле - PullRequest
0 голосов
/ 04 ноября 2019

Рассмотрим следующие POJO:

public class PersonVo {
    private String firstName;
    private String lastName;
}

private class PersonEntity {
    private String fullName;
}

Используя MapStruct, я хочу создать маппер, который PersonVo в PersonEntity.
Мне нужно отобразить несколько исходных полей firstName, lastName водна цель подана fullName.

Вот псевдокод, к которому я хочу.

[Требуется решение A]

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = {"firstName", "lastName"}, qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(String firstName, String lastName) {
        return firstName + lastName;
    }
}

[Требуется решение B]

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = PersonVo.class, qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(PersonVo pserson) {
        return pserson.getFirstName() + pserson.getLastName();
    }
}

Есть ли способ, которым это может быть достигнуто?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вот мой ответ.

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = ".", qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(PersonVo pserson) {
        return pserson.getFirstName() + pserson.getLastName();
    }
}

Суть в том, что

@ Mapping (target = "fullName", source = ".", qualByName = "toFullName")

Может использовать исходный объект по параметру.

0 голосов
/ 06 ноября 2019

Сначала я бы пошел с публичным абстрактным классом для Mappers. Упрощает их расширение и создание наследования между сгенерированным кодом и абстрактным классом. Но вот ваше решение: вы можете достичь этого, создав аннотированный метод @AfterMapping. Так что-то вроде

@AfterMapping
default void concat(@MappingTarget PersonEntity person, PersonVo person) {
  ... manipulate the target value
}

Документация MapStruct

...