mapstruct:使用来自 DTO 的数据更新实体的现有字段

mapstruct: update existing field of entity using data from DTO

我最近在我的项目中添加了 mapStruct。这个框架很酷,但我想不通一件事。

这是我的情况:我有 Profile 个类型为 Person 的实体和字段。我想使用 ProfileDto 更新它。我为此使用 void fromDto(ProfileDto dto, @MappingTarget Profile entity) 方法。问题是 mapper 总是 create new Person 而不是使用来自 profile entity

的 person

我的实体是:

public class Profile  {
    private Person person;
    .. setters, getters and  constructors 
}

public class Person extends AbstractEntity {
    private String name;
    private String surname;
    .. setters, getters and  constructors 
}

Dto

public class ProfileDto  extends AbstractDto {
    private String name;
    private String surname;
    .. setters, getters and  constructors 
}

我的映射器

public abstract class ProfileMapper {

    @Mappings({
            @Mapping(target = "name", source = "entity.person.name"),
            @Mapping(target = "surname", source = "entity.person.surname")

    })
    public abstract ProfileDto toDto(Profile entity);

    @InheritInverseConfiguration(name = "toDto")
    public abstract void fromDto(ProfileDto dto, @MappingTarget Profile entity);
}

生成代码

      @Override
        public void fromDto(ProfileDto dto, Profile entity) {
            if ( dto == null ) {
                return;
            }
            Person person = new Person();
            entity.setPerson( person );
...

我不需要在这里创建新的 person 实例

person = new Person();

我用什么来替换这个字符串:

人=entity.getPerson()

这是一个已知问题,请参阅 #1011。这在 1.2.0 中得到了改进(在撰写本文时 11.07.2017 最新版本是 1.2.0.Beta3)。您应该尝试最新版本,它应该可以正常工作。