为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容708150 2022-11-10 16:36:38
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();有没有办法达到这样的要求?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

@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,映射器必须是一个类,而不是一个接口


查看完整回答
反对 回复 2022-11-10
  • 1 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号