Mapstruct如何从源对象的2个或更多字段构造目标对象?

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);

}

我尝试使用 2String来Address但它抛出


不明确的属性异常


.


我应该在映射器中添加什么到 mapstreet和cityof PersonDTOto 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();

有没有办法达到这样的要求?


慕容708150
浏览 200回答 1
1回答

喵喔喔

@Mapper(componentModel = "spring")interface Mapper {    @Mappings({            @Mapping(source = "street", target = "address.street"),            @Mapping(source = "city", target = "address.city")    })    Person fromPersonDTO(PersonDTO dto);}属性name应该自动映射,只要它具有相同的名称和嵌套级别更新:@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();        }    }}请注意,为了使用自动装配的 bean,映射器必须是一个类,而不是一个接口
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java