【问题标题】:How to map objects as fields with mapstruct?如何使用mapstruct将对象映射为字段?
【发布时间】:2020-10-12 19:07:52
【问题描述】:

我需要将多个 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);

非常感谢。

【问题讨论】:

  • 请提供 CustomerEntity、CsvBusinessData 和 AddressEntity 类,让您的问题更清晰

标签: java spring-boot mapstruct


【解决方案1】:

首先你不必为同名的字段做映射,MapStruct 会为你做。例如block-block。 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2019-03-14
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2021-04-25
    • 2018-09-06
    相关资源
    最近更新 更多