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

时间:2017-07-11 14:31:24

标签: mapstruct

我最近在我的项目中添加了mapStruct。这个框架很酷,但我无法弄清楚一件事。

这是我的情况:我有Profile实体和Person类型的字段。我想使用ProfileDto更新它。我正在使用void fromDto(ProfileDto dto, @MappingTarget Profile entity)方法。问题是映射器总是创建新人而不是使用来自profile实体的人

我的实体是:

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 = new Person();

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

person = entity.getPerson()

1 个答案:

答案 0 :(得分:1)

这是一个已知问题,请参阅#1011。这在1.2.0得到了改进(在撰写本文时间为2017年7月17日,最新版本为1.2.0.Beta3)。您应该尝试使用最新版本,它应该按预期工作。