В настоящее время я использую Spring Webflux и MongoDB вместе с набором CRUD REST API. Итак, у меня есть сервисный метод, который принимает идентификатор существующего объекта, обновленного объекта, а затем отображает обновленные данные в существующий. Как здесь:
ServiceImpl. java
@Override
public Mono<Computer> update(String id, Computer computer) {
return repo.findById(id)
.switchIfEmpty(Mono.error(new Exception("COMPUTER_NOT_FOUND")))
.map(c -> computer)
.flatMap(repo::save);
}
Мой метод REST Controller: EnpointController. java
@PutMapping("/{id}")
public Mono<Computer> updateOneComputer(@PathVariable("id") String id,@Valid @RequestBody Computer parsedBody) {
return computerService.update(id, parsedBody);
}
Но проблема в следующем: вместо обновления делает новую запись в БД. Я попытался что-то вроде установить индивидуальное поле существующего объекта с обновлением. Работает, обновляет существующий документ, но не эффективно. Это не решение, особенно с внедренным документом в Mon go. Как это:
@Override
public Mono<Computer> update(String id, Computer computer) {
return repo.findById(id)
.switchIfEmpty(Mono.error(new Exception("COMPUTER_NOT_FOUND")))
.map(c -> {
c.setFoo(computer.getFoo());
c.setBar(computer.getBar());
//and so on!
})
.flatMap(repo::save);
}
Мои сущности
Компьютер. java
@Document(value = "computers")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class Computer extends BaseDocument {
private String name;
private String customerId;
private String computerModel;
private String computerSpecs;
private String otherPart;
}
BaseDocument. java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseDocument {
@Id
private String id;
@CreatedDate
private Date createdDate;
@LastModifiedDate
private Date updatedDate;
@CreatedBy
private String createdBy;
@LastModifiedBy
private String updatedBy;
private char deleted = 'N';
}
Пожалуйста, помогите и заранее спасибо!