gpt4 book ai didi

java - Spring Reactive Web 更新方法创建新记录而不是更新现有记录

转载 作者:行者123 更新时间:2023-12-04 10:27:06 25 4
gpt4 key购买 nike

目前我正在使用 Spring Webflux 和 MongoDB,以及一组 CRUD REST API。
所以我有一个服务方法,它接收一个现有对象的 ID,一个更新的对象,然后将更新的数据映射到现有的数据。像这儿:

服务实现程序

@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 方法:
端点 Controller .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;
}

基本文档.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com