目前我正在使用 Spring Webflux 和 MongoDB,以及一组 CRUD REST API。 因此,我有一个服务方法,它接受现有对象的 ID、更新的对象,然后将更新的数据映射到现有的数据。就像这里:
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);
}
但问题是:它没有更新,而是在数据库中创建了一条新记录。我尝试过使用更新对象设置现有对象的单独字段之类的操作。它有效,更新了现有文档,但效率不高。这不是一个解决方案,特别是对于 Mongo 中的嵌入式文档。 像这样:
@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';
}
请帮忙并提前致谢!
最佳答案
试试这个:
.map(c -> {computer.setId(id); return computer;})
关于java - Spring Reactive Web 更新方法创建一条新记录而不是更新现有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60589600/