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

标签 java mongodb spring-boot reactive-programming spring-webflux

目前我正在使用 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/

相关文章:

java - @Schedule 带有 CDI 错误 :Could not get current FacesContext

java - JSF 2.0 和参数化 EL 表达式的问题

Java - Eclipse 中未定义的方法

javascript - 如何处理 MongoDB 键名中的点?

spring-boot - 如何在 Spring Boot 中使用 grpc

java - 普通 Spring Batch 示例中非作业方法的 Bean 注释的目的

java - 自定义即时解串器无法正常工作。不断收到 HttpMessageNotReadableException

mongodb - MongoD 不会在 CentOS 上停止

node.js - MongoDB 在查询后导致 Express 崩溃

java - 'Pre-Authorized'注释的结果是否被缓存?