在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());
}