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
)。您应该尝试最新版本,它应该可以正常工作。
我最近在我的项目中添加了 mapStruct。这个框架很酷,但我想不通一件事。
这是我的情况:我有 Profile
个类型为 Person
的实体和字段。我想使用 ProfileDto
更新它。我为此使用 void fromDto(ProfileDto dto, @MappingTarget Profile entity)
方法。问题是 mapper 总是 create new Person 而不是使用来自 profile
entity
我的实体是:
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
)。您应该尝试最新版本,它应该可以正常工作。