使用 mapstruct 从 DTO 映射到实体时,为什么我得不到 id?
Why do not I get the id when mapping from DTO to entity with mapstruct?
我有一个 API 和 spring 引导,我使用 mapstruct,我只想更新 Person 实体。为此,让 PersonD 更新 Person。
到目前为止我有:
映射器:
@Mapper
public interface PersonMapper {
PersonDto toPersonDto(Person person);
Person toPerson(PersonDto personDto);
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget
Person document);
}
在服务层:
查找人员:
public PersonDto updatePerson(Long personId) {
PersonDto personDto = personService.findById(personId)
.orElseThrow(() -> new PersonNotFoundException(id));
personDto.set(...) //set others properties
Person person = personMapper.toPerson(personDto);
person = personMapper.updatePersonFromDto(personDto, person);
personRepository.save(person);
return personMapper.toPersonDto(person);
}`
我的问题是,是否有从 DTO 更新实体的策略或更好的方法?
编辑:
我能够解决一部分,现在我没有丢失 id,但我仍然创建一个新对象而不是更新它。 id 在 AbstractPersistableEntity 中。
@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person extends AbstractPersistableEntity<ID> implements Serializable {
@Column
private String name;
@Column
private String lastName;
@Column
private Integer age;
}
public class PersonDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
private String name;
private String lastName;
private Integer age;
}
也许这不是最佳或最正确的解决方案,但它确实有效。我对映射器进行了以下修改:
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget
Person document);
@ObjectFactory
default Person updatePerson(PersonDto personDto, Person person){
if (personDto != null){
Long id = person.getId();
Person resultPerson = updatePersonFromDto(personDto, person);
resultPerson.setId(id);
return resultPerson;
}
return null;
}
然后从服务调用:
person = personMapper.updatePerson(personDto, person);
我有一个 API 和 spring 引导,我使用 mapstruct,我只想更新 Person 实体。为此,让 PersonD 更新 Person。
到目前为止我有: 映射器:
@Mapper
public interface PersonMapper {
PersonDto toPersonDto(Person person);
Person toPerson(PersonDto personDto);
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget
Person document);
}
在服务层: 查找人员:
public PersonDto updatePerson(Long personId) { PersonDto personDto = personService.findById(personId) .orElseThrow(() -> new PersonNotFoundException(id)); personDto.set(...) //set others properties Person person = personMapper.toPerson(personDto); person = personMapper.updatePersonFromDto(personDto, person); personRepository.save(person); return personMapper.toPersonDto(person); }`
我的问题是,是否有从 DTO 更新实体的策略或更好的方法?
编辑: 我能够解决一部分,现在我没有丢失 id,但我仍然创建一个新对象而不是更新它。 id 在 AbstractPersistableEntity 中。
@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person extends AbstractPersistableEntity<ID> implements Serializable {
@Column
private String name;
@Column
private String lastName;
@Column
private Integer age;
}
public class PersonDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
private String name;
private String lastName;
private Integer age;
}
也许这不是最佳或最正确的解决方案,但它确实有效。我对映射器进行了以下修改:
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget
Person document);
@ObjectFactory
default Person updatePerson(PersonDto personDto, Person person){
if (personDto != null){
Long id = person.getId();
Person resultPerson = updatePersonFromDto(personDto, person);
resultPerson.setId(id);
return resultPerson;
}
return null;
}
然后从服务调用:
person = personMapper.updatePerson(personDto, person);