有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要将多个dto映射到实体。 几乎所有的dto都有对另一个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);

多谢各位


共 (1) 个答案

  1. # 1 楼答案

    首先,您不必为具有相同名称的字段进行映射,MapStruct会为您进行映射。例如块。 1) 您的对象是相关的: 您可以对相关对象使用“uses”功能

    @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中有相同的字段名,那个么只需指定它的地址即可。街道名称或顾客。姓氏

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