Почему я не получаю идентификатор при отображении из DTO в сущность с mapstruct? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть API с весенней загрузкой, и я использую mapstruct, и я просто хочу обновить сущность Person. Для этого, имея PersonDto обновить Person.

Что у меня так далеко: Mapper:

@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?

Edit: Я смог решить часть, теперь я не теряю идентификатор, но я все равно создаю новый объект вместо того, чтобы обновлять его. Идентификатор находится в 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;
}

1 Ответ

0 голосов
/ 21 июня 2019

Возможно, это не самое оптимальное или правильное решение, но оно работает. Я сделал следующие изменения в маппере:

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