如何使用mapstruct将对象映射为字段?

问题描述 投票:0回答:1

我需要将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和entite。

这里是给客户的体现:

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);

非常感谢。

java spring-boot mapstruct
1个回答
0
投票

首先,您不必为具有相同名称的字段进行映射,MapStruct会为您完成。例如,块-块。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") //don't needed as same name, delete it
    @Mapping(target = "address", source = "address") //don't 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") //don't needed as same name, delete it
    @Mapping(target="streetNumber", source="streetNumber") //don't needed as same name, delete it
    @Mapping(target="block", source="block") //don't needed as same name, delete it
    @Mapping(target="floor", source="floor") //don't needed as same name, delete it
    CsvBusinessData asDto(AddressEntity address);
}

2)您的对象不相关:您可以通过传递少量对象作为参数来解决您的问题。但是,那么您必须有自己的相反方向方法。如果您在AddressEntity和CustomerEntity中具有相同的字段名称,则只需将其指定为address.streetName或customer.lastName

@Mapping(target="streetName", source="streetName")//possibly don't needed as same name
@Mapping(target="streetNumber", source="streetNumber")//possibly don't needed as same name
@Mapping(target="block", source="block")//possibly don't needed as same name
@Mapping(target="floor", source="floor")//possibly don't needed as same name
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo")//possibly don't 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 don't needed as same name
@Mapping(target="streetNumber", source="streetNumber")//possibly don't needed as same name
@Mapping(target="block", source="block")//possibly don't needed as same name
@Mapping(target="floor", source="floor")//possibly don't needed as same name
AddressEntity asAddressEntity(CsvBusinessData businessData);

@Mapping(source = "nom", target = "lastName")
@Mapping(source = "nd", target = "accountNumber")
@Mapping(source = "logo", target = "logo")//possibly don't needed as same name
@Mapping(source = "address", target = "address") //specified as you have parameter address
CustomerEntity asCustomerEntity(CsvBusinessData businessData);
© www.soinside.com 2019 - 2024. All rights reserved.