Mapstruct, как построить целевой объект из 2 или более полей исходного объекта? - PullRequest
2 голосов
/ 07 мая 2019
class PersonDTO {
  String name;
  String street;
  String city;
}
class Person {
  String name;
  Address address;
}
class Address {
  String street;
  String city;
}

@Mapper(componentModel = "spring")
interface Mapper {
  Person fromPersonDTO(PersonDTO dto);
}

Я пытался использовать от 2 String до Address, но выдает

неоднозначное исключение свойства

.

Чтоя должен добавить в маппере для сопоставления street и city из PersonDTO в Address?

обновление:

@Mapper(componentModel = "spring")
interface Mapper {
  @Mapping(source = "street", target = "address.street")
  @Mapping(source = "city", target = "address.city")
  Person fromPersonDTO(PersonDTO dto);
}

Над мапперомобрабатывать прямое отображение.Но что, если я хотел бы добавить некоторую бизнес-логику при создании объекта Address,

, например:

address.street = street.replaceAll(" ", "_"); 
address.city = cityDao.findByName(city).getId();

Есть ли способ выполнить такое требование?

1 Ответ

1 голос
/ 07 мая 2019
@Mapper(componentModel = "spring")
interface Mapper {

    @Mappings({
            @Mapping(source = "street", target = "address.street"),
            @Mapping(source = "city", target = "address.city")
    })
    Person fromPersonDTO(PersonDTO dto);
}

Свойство name должно отображаться автоматически, если оно имеет то же имя и вложенный уровень

UPDATE

@Mapper(componentModel = "spring")
public abstract class Mapper {

    @Autowired
    private CityDAO cityDao;

    @Mappings({
            @Mapping(source = "street", target = "address.street"),
            @Mapping(source = "city", target = "address.city")
    })
    Person fromPersonDTO(PersonDTO dto);

    @AfterMapping
    void after(@MappingTarget Person person) {
        Address address = person.getAddress();
        if (address != null) {
            // additional null-checks might be required
            address.setStreet(address.getStreet().replaceAll(" ", "_")); 
            address.setCity(cityDao.findByName(address.getCity()).getId();
        }
    }
}

Обратите внимание, что для использования бина с автопроводкой маппер должен быть классом, а не интерфейсом

...