【问题标题】:Why do not I get the id when mapping from DTO to entity with mapstruct?为什么我在使用 mapstruct 从 DTO 映射到实体时没有得到 id?
【发布时间】:2019-06-21 21:53:28
【问题描述】:

我有一个带有 Spring Boot 的 API,我使用 mapstruct,我只想更新 Person 实体。为此,让 PersonD 更新 Person。

到目前为止我所拥有的: 映射器:

@Mapper
public interface PersonMapper {
   PersonDto toPersonDto(Person person);
   Person toPerson(PersonDto personDto);

   Person updatePersonFromDto(PersonDto persoonDto, @MappingTarget 
      Person document);
}
  1. 在服务层: 找人:

    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;
}

【问题讨论】:

  • 映射器已生成,您希望在此代码中改进什么?
  • 不要通过将 DTO 映射到实体来丢失 id,以便能够更新数据库中的实体而不是创建新的元组。
  • 您能否向我们展示一下 Person 和 PersonDto 的代码以及任何可以改变映射器行为的特定设置?
  • 我也更新了映射器。
  • 在这种情况下,您可能必须实现自己的映射器

标签: spring-boot mapstruct


【解决方案1】:

也许它不是最佳或正确的解决方案,但它确实有效。我对映射器进行了以下修改:

 @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);

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多