在MapStruct中使用多个源对象

在MapStruct中使用多个源对象

1.介绍

如何在MapStruct中使用多个源对象。

2.单个源对象

MapStruct最常见的用例是将一个对象映射到另一个对象。 假设我们有一个Customer类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Customer {
    private String firstName;
    private String lastName;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomerDto {
    private String forename;
    private String surname;
}

定义一个映射器,将一个Customer对象映射到一个CustomerDto对象:

3.多个源对象

有时我们希望目标对象具有来自多个源对象的属性。

假设 编写了一个购物应用程序。需要构造一个送货地址:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeliveryAddress {
    private String forename;
    private String surname;
    private String street;
    private String postalcode;
    private String county;
}

每个客户可以有多个地址。 一个可以是家庭住址。 另一个可以是工作地址:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
    private String street;
    private String postalcode;
    private String county;
}

需要一个映射器,该映射器可以根据客户及其地址之一创建收获地址。 MapStruct通过具有多个源对象来支持此操作:

@Mapper(componentModel = "spring")
public interface DeliveryAddressMapper {
    @Mapping(source = "customer.firstName", target = "forename")
    @Mapping(source = "customer.lastName", target = "surname")
    @Mapping(source = "address.street", target = "street")
    @Mapping(source = "address.postalcode", target = "postalcode")
    @Mapping(source = "address.county", target = "county")
    DeliveryAddress from(Customer customer, Address address);
}

单元测试

    @Test
    public void test12() {

        Customer customer = new Customer();
        customer.setFirstName("张");
        customer.setLastName("三");


        Address homeAddress = new Address();
        homeAddress.setStreet("科技二路");
        homeAddress.setCounty("雁塔区");
        homeAddress.setPostalcode("89123");

        DeliveryAddress deliveryAddress = deliveryAddressMapper.from(customer, homeAddress);

        assertEquals(deliveryAddress.getForename(), customer.getFirstName());
        assertEquals(deliveryAddress.getSurname(), customer.getLastName());
        assertEquals(deliveryAddress.getStreet(), homeAddress.getStreet());
        assertEquals(deliveryAddress.getCounty(), homeAddress.getCounty());
        assertEquals(deliveryAddress.getPostalcode(), homeAddress.getPostalcode());
    }

4.使用@MappingTarget更新已存在的对象

到现在为止,已经有了可以创建目标类新实例的映射器。 使用多个源对象,还可以提供一个要更新的实例。

使用@MappingTarget对其进行处理:

    @Test
    public void test13() {

        DeliveryAddress deliveryAddress = new DeliveryAddress();
        deliveryAddress.setForename("张");
        deliveryAddress.setSurname("三");
        deliveryAddress.setStreet("科技二路");
        deliveryAddress.setCounty("雁塔区");
        deliveryAddress.setPostalcode("89123");
        ;


        Address newAddress = new Address();
        newAddress.setStreet("西长安街");
        newAddress.setCounty("长安区");
        newAddress.setPostalcode("12345");


        DeliveryAddress updatedDeliveryAddress = deliveryAddressMapper.updateAddress(deliveryAddress, newAddress);


        assertSame(deliveryAddress, updatedDeliveryAddress);

        assertEquals(deliveryAddress.getStreet(), newAddress.getStreet());
        assertEquals(deliveryAddress.getCounty(), newAddress.getCounty());
        assertEquals(deliveryAddress.getPostalcode(), newAddress.getPostalcode());
    }

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值