当前位置: 首页 > 知识库问答 >
问题:

地图结构似乎创建了太多的方法

宋智明
2023-03-14

我正在使用Mapstruct v1.4.1.Final将Hibernate实体映射到相应的DTO。我使用Spring Boot,所以我的映射器的类具有等于Spring组件模型

我有2个实体,PersonAddressPerson包含一个Address实例:

public class Person {
    private String username;
    private String name;
    private Address address;
}
public class PersonDto {
    private String id;
    private String name;
    private AddressDto address;
    private String role;
}

地址

public class Address {
    private String addr;
    private String city;
}
public class AddressDto {
    private String houseAddress;
    private String city;
}

这是我写的地图:

地图绘制者

@Mapper(componentModel = "spring")
public interface AddressMapper {
    @Mapping(source="person.username", target="userName")
    @Mapping(source="address.addr", target="address")
    DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);

    @Mapping(source="person.username", target="userName")
    @Mapping(source="person.address.addr", target="address")
    DeliveryAddressDto personToDeliveryAddressDto(Person person);

    @Mapping(source = "address.addr", target = "houseAddress")
    AddressDto addressToAddressDto(Address address);
    @InheritInverseConfiguration(name = "addressToAddressDto")
    Address addressDtoToAddress(AddressDto addressDto);
}
@Mapper(componentModel = "spring", uses = {AddressMapper.class})
public interface PersonMapper {

    @Mapping(source = "id", target = "username")
    @Mapping(source = "address.houseAddress", target = "address.addr")
    @Mapping(source = "role", target = "role.id")
    Person toPerson(PersonDto personDto);
    List<Person> toPeople(List<PersonDto> personDtos);

    @InheritInverseConfiguration(name = "toPerson")
    PersonDto toPersonDto(Person person);
    List<PersonDto> toPeopleDto(List<Person> people);

    /**
     * update an existing Person with Dto info.
     * Set infos on the existing object (Person), without creating a new one.
      */
    @Mapping(source = "role", target = "role.id")
    void updatePersonFromDto(PersonDto personDto, @MappingTarget Person person);

}

您可以看到,我对< code>PersonMapper说使用< code>AddressMapper来使用它的实现。

但是,为了将地址转换为地址dto,我在PersonMapper类中找到了另一个实现(与反向映射相同):

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-11-21T15:44:55+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class AddressMapperImpl implements AddressMapper {

    @Override
    public DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address) {
        if ( person == null && address == null ) {
            return null;
        }

        DeliveryAddressDto deliveryAddressDto = new DeliveryAddressDto();

        if ( person != null ) {
            deliveryAddressDto.setUserName( person.getUsername() );
        }
        if ( address != null ) {
            deliveryAddressDto.setAddress( address.getAddr() );
        }

        return deliveryAddressDto;
    }

    @Override
    public DeliveryAddressDto personToDeliveryAddressDto(Person person) {
        if ( person == null ) {
            return null;
        }

        DeliveryAddressDto deliveryAddressDto = new DeliveryAddressDto();

        deliveryAddressDto.setUserName( person.getUsername() );
        deliveryAddressDto.setAddress( personAddressAddr( person ) );

        return deliveryAddressDto;
    }

    @Override
    public AddressDto addressToAddressDto(Address address) {
        if ( address == null ) {
            return null;
        }

        AddressDto addressDto = new AddressDto();

        addressDto.setHouseAddress( address.getAddr() );
        addressDto.setCity( address.getCity() );

        return addressDto;
    }

    @Override
    public Address addressDtoToAddress(AddressDto addressDto) {
        if ( addressDto == null ) {
            return null;
        }

        Address address = new Address();

        address.setAddr( addressDto.getHouseAddress() );
        address.setCity( addressDto.getCity() );

        return address;
    }

    private String personAddressAddr(Person person) {
        if ( person == null ) {
            return null;
        }
        Address address = person.getAddress();
        if ( address == null ) {
            return null;
        }
        String addr = address.getAddr();
        if ( addr == null ) {
            return null;
        }
        return addr;
    }
}
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-11-21T15:44:55+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class PersonMapperImpl implements PersonMapper {

    @Autowired
    private AddressMapper addressMapper;

    @Override
    public Person toPerson(PersonDto personDto) {
        if ( personDto == null ) {
            return null;
        }

        Person person = new Person();

        person.setAddress( addressDtoToAddress1( personDto.getAddress() ) );
        person.setRole( personDtoToRole( personDto ) );
        person.setUsername( personDto.getId() );
        person.setName( personDto.getName() );

        return person;
    }

    @Override
    public List<Person> toPeople(List<PersonDto> personDtos) {
        if ( personDtos == null ) {
            return null;
        }

        List<Person> list = new ArrayList<Person>( personDtos.size() );
        for ( PersonDto personDto : personDtos ) {
            list.add( toPerson( personDto ) );
        }

        return list;
    }

    @Override
    public PersonDto toPersonDto(Person person) {
        if ( person == null ) {
            return null;
        }

        PersonDto personDto = new PersonDto();

        personDto.setAddress( addressToAddressDto1( person.getAddress() ) );
        personDto.setId( person.getUsername() );
        personDto.setRole( personRoleId( person ) );
        personDto.setName( person.getName() );

        return personDto;
    }

    @Override
    public List<PersonDto> toPeopleDto(List<Person> people) {
        if ( people == null ) {
            return null;
        }

        List<PersonDto> list = new ArrayList<PersonDto>( people.size() );
        for ( Person person : people ) {
            list.add( toPersonDto( person ) );
        }

        return list;
    }

    @Override
    public void updatePersonFromDto(PersonDto personDto, Person person) {
        if ( personDto == null ) {
            return;
        }

        if ( person.getRole() == null ) {
            person.setRole( new Role() );
        }
        personDtoToRole1( personDto, person.getRole() );
        person.setName( personDto.getName() );
        person.setAddress( addressMapper.addressDtoToAddress( personDto.getAddress() ) );
    }

    protected Address addressDtoToAddress1(AddressDto addressDto) {
        if ( addressDto == null ) {
            return null;
        }

        Address address = new Address();

        address.setAddr( addressDto.getHouseAddress() );
        address.setCity( addressDto.getCity() );

        return address;
    }

    protected Role personDtoToRole(PersonDto personDto) {
        if ( personDto == null ) {
            return null;
        }

        Role role = new Role();

        role.setId( personDto.getRole() );

        return role;
    }

    protected AddressDto addressToAddressDto1(Address address) {
        if ( address == null ) {
            return null;
        }

        AddressDto addressDto = new AddressDto();

        addressDto.setHouseAddress( address.getAddr() );
        addressDto.setCity( address.getCity() );

        return addressDto;
    }

    private String personRoleId(Person person) {
        if ( person == null ) {
            return null;
        }
        Role role = person.getRole();
        if ( role == null ) {
            return null;
        }
        String id = role.getId();
        if ( id == null ) {
            return null;
        }
        return id;
    }

    protected void personDtoToRole1(PersonDto personDto, Role mappingTarget) {
        if ( personDto == null ) {
            return;
        }

        mappingTarget.setId( personDto.getRole() );
    }
}

在此实现中,为什么创建方法地址到地址1()?为什么不使用地址映射器实现中提供的地址Dto地址()?这些方法是相同的。

另请注意,地址映射器被注入到人员映射器中,地址映射器的方法地址DtoAddress()在方法更新中调用。

共有1个答案

令狐嘉禧
2023-03-14

您在PERMapper中两次指定地址映射。

@Mapping(source = "id", target = "username")
@Mapping(source = "address.houseAddress", target = "address.addr")
Person toPerson(PersonDto personDto);

您声明PersonMapper应该使用AddressMapper,但是您添加了另一个覆盖映射来手动映射字段。

您只需删除映射,它就会自己找到正确的映射。

@Mapping(source = "id", target = "username")
Person toPerson(PersonDto personDto);

如果要添加显式映射,则需要将源作为PERDto的地址字段选择为目标Person的地址字段。下面将给出相同的结果。

@Mapping(source = "id", target = "username")
@Mapping(source = "address", target = "address")
Person toPerson(PersonDto personDto);

它在< code > updatePersonFromDto()中工作得很好,因为您没有添加它的覆盖,它自己从< code>AddressMapper中选取它。如果您向它添加相同的冗余映射,您会注意到相同的行为。

 类似资料:
  • 问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如

  • 在探索中等维度数据时,经常需要在数据集的不同子集上绘制同一类型图的多个实例。这种技术有时被称为“网格”或“格子”绘图,它与“多重小图”的概念有关。这种技术使查看者从复杂数据中快速提取大量信息。 Matplotlib为绘制这种多轴图提供了很好的支持; seaborn构建于此之上,可直接将绘图结构和数据集结构关系起来。 要使用网格图功能,数据必须在Pandas数据框中,并且必须采用 Hadley Wh

  • 我从quarkus开始,我的构建本机速度太慢(超过一个小时,并已退出内存错误)。我删除了quarkus

  • 问题内容: 我没有找到这样的多图构造…当我想这样做时,我遍历了地图,并填充了多图。还有其他方法吗? 第一个结果是,但我希望 问题答案: 假设你有 那我相信这是最好的 或更佳,但更难阅读

  • 问题内容: 我正在比较测试程序上的两个变体。两者都在具有四个内核的计算机上以4线程运行。 在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I / O)。 这里没有分而治之。从字面上看,我知道 在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.i

  • 使用亿景智图,您可以生成自己的业务地图,并在线共享和发布这些地图,比如,客户分布图、配送路线图、布局规划图等等。生成一幅地图,基本流程是这样的:新建地图->添加图层->绘制对象(支持批量添加及使用已有数据)->发布地图。这里,为大家介绍,如何构建自定义地图: ● 新建地图 ● 上传Excel/CSV数据 ● 快速添加行政区划 ● 手动绘制地图 ● 搜索添加标注 ● 设置地图名称 ● 设定地图默认视