如何使用 mapstruct 将对象映射为字段?
How to map objects as fields with mapstruct?
我需要将多个 dto 映射到实体。
几乎所有的都引用了另一个,我不知道如何在映射 dto 时传递引用。
这是地址的一种业务实现:
addressRepository.saveAll(dtos.stream()
.map(addressMapper::asEntity)
.collect(Collectors.toList())).stream()
.map(addressMapper::asDto)
.collect(Collectors.toList());
这是映射器
@Mappings({
@Mapping(target="streetName", source="streetName"),
@Mapping(target="streetNumber", source="streetNumber"),
@Mapping(target="block", source="block"),
@Mapping(target="floor", source="floor")
})
CsvBusinessData asDto(AddressEntity address);
@InheritInverseConfiguration
AddressEntity asAddressEntity(CsvBusinessData address);
所有实现者都从同一个 dto 中读取,然后将它们映射到 dto 和实体。
这是为客户实施的:
customerRepository.saveAll(dtos.stream()
.map( csvMapper::asCustomerEntity)
.collect(Collectors.toList())).stream()
.map(customerMapper::asDto)
.collect(Collectors.toList());
以及我想要引用映射地址实体的映射(我的客户实体有一个地址类型字段)。
@Mappings({
@Mapping(target = "nom", source = "lastName"),
@Mapping(target = "nd", source = "accountNumber"),
@Mapping(target = "logo", source = "logo"),
@Mapping(target = "address", source = "address"
)
})
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
非常感谢。
首先,您不必为具有相同名称的字段进行映射,MapStruct 为 you.For 示例块块做映射。
1)你的对象是相关的:
您可以对相关对象使用“使用”功能。
@Mapper(uses = {AddressMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo") // not needed as same name, delete it
@Mapping(target = "address", source = "address") // not needed as same name, delete it
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
}
@Mapper( unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target="streetName", source="streetName") // not needed as same name, delete it
@Mapping(target="streetNumber", source="streetNumber") // not needed as same name, delete it
@Mapping(target="block", source="block") // not needed as same name, delete it
@Mapping(target="floor", source="floor") // not needed as same name, delete it
CsvBusinessData asDto(AddressEntity address);
}
2)您的对象不相关:
您可以通过传递几个对象作为参数来解决您的问题。但是你必须有自己的相反方向的方法。如果您在 AddressEntity 和 CustomerEntity 中有相同的字段名称,那么只需指定它 address.streetName 或 customer.lastName
@Mapping(target="streetName", source="streetName")// possibly not needed as same name
@Mapping(target="streetNumber", source="streetNumber")// possibly not needed as same name
@Mapping(target="block", source="block")// possibly not needed as same name
@Mapping(target="floor", source="floor")// possibly not needed as same name
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo")// possibly not needed as same name
@Mapping(target = "address", source = "customer.address") // specified as you have parameter address
CsvBusinessData asDto(AddressEntity address, CustomerEntity customer);
@Mapping(target="streetName", source="streetName")// possibly not needed as same name
@Mapping(target="streetNumber", source="streetNumber")// possibly not needed as same name
@Mapping(target="block", source="block")// possibly not needed as same name
@Mapping(target="floor", source="floor")// possibly not needed as same name
AddressEntity asAddressEntity(CsvBusinessData businessData);
@Mapping(source = "nom", target = "lastName")
@Mapping(source = "nd", target = "accountNumber")
@Mapping(source = "logo", target = "logo")// possibly not needed as same name
@Mapping(source = "address", target = "address") // specified as you have parameter address
CustomerEntity asCustomerEntity(CsvBusinessData businessData);
我需要将多个 dto 映射到实体。 几乎所有的都引用了另一个,我不知道如何在映射 dto 时传递引用。
这是地址的一种业务实现:
addressRepository.saveAll(dtos.stream()
.map(addressMapper::asEntity)
.collect(Collectors.toList())).stream()
.map(addressMapper::asDto)
.collect(Collectors.toList());
这是映射器
@Mappings({
@Mapping(target="streetName", source="streetName"),
@Mapping(target="streetNumber", source="streetNumber"),
@Mapping(target="block", source="block"),
@Mapping(target="floor", source="floor")
})
CsvBusinessData asDto(AddressEntity address);
@InheritInverseConfiguration
AddressEntity asAddressEntity(CsvBusinessData address);
所有实现者都从同一个 dto 中读取,然后将它们映射到 dto 和实体。
这是为客户实施的:
customerRepository.saveAll(dtos.stream()
.map( csvMapper::asCustomerEntity)
.collect(Collectors.toList())).stream()
.map(customerMapper::asDto)
.collect(Collectors.toList());
以及我想要引用映射地址实体的映射(我的客户实体有一个地址类型字段)。
@Mappings({
@Mapping(target = "nom", source = "lastName"),
@Mapping(target = "nd", source = "accountNumber"),
@Mapping(target = "logo", source = "logo"),
@Mapping(target = "address", source = "address"
)
})
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
非常感谢。
首先,您不必为具有相同名称的字段进行映射,MapStruct 为 you.For 示例块块做映射。 1)你的对象是相关的: 您可以对相关对象使用“使用”功能。
@Mapper(uses = {AddressMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo") // not needed as same name, delete it
@Mapping(target = "address", source = "address") // not needed as same name, delete it
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
}
@Mapper( unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target="streetName", source="streetName") // not needed as same name, delete it
@Mapping(target="streetNumber", source="streetNumber") // not needed as same name, delete it
@Mapping(target="block", source="block") // not needed as same name, delete it
@Mapping(target="floor", source="floor") // not needed as same name, delete it
CsvBusinessData asDto(AddressEntity address);
}
2)您的对象不相关: 您可以通过传递几个对象作为参数来解决您的问题。但是你必须有自己的相反方向的方法。如果您在 AddressEntity 和 CustomerEntity 中有相同的字段名称,那么只需指定它 address.streetName 或 customer.lastName
@Mapping(target="streetName", source="streetName")// possibly not needed as same name
@Mapping(target="streetNumber", source="streetNumber")// possibly not needed as same name
@Mapping(target="block", source="block")// possibly not needed as same name
@Mapping(target="floor", source="floor")// possibly not needed as same name
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo")// possibly not needed as same name
@Mapping(target = "address", source = "customer.address") // specified as you have parameter address
CsvBusinessData asDto(AddressEntity address, CustomerEntity customer);
@Mapping(target="streetName", source="streetName")// possibly not needed as same name
@Mapping(target="streetNumber", source="streetNumber")// possibly not needed as same name
@Mapping(target="block", source="block")// possibly not needed as same name
@Mapping(target="floor", source="floor")// possibly not needed as same name
AddressEntity asAddressEntity(CsvBusinessData businessData);
@Mapping(source = "nom", target = "lastName")
@Mapping(source = "nd", target = "accountNumber")
@Mapping(source = "logo", target = "logo")// possibly not needed as same name
@Mapping(source = "address", target = "address") // specified as you have parameter address
CustomerEntity asCustomerEntity(CsvBusinessData businessData);