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

Posted

技术标签:

【中文标题】Spring Reactive Web 更新方法创建新记录而不是更新现有记录【英文标题】:Spring Reactive Web update method makes a new record instead of update the existing one 【发布时间】:2020-06-20 16:42:48 【问题描述】:

目前我正在使用 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 控制器方法: 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';

请提前帮助和感谢!

【问题讨论】:

能否请您发布您的实体类,并调试您的实体拥有/获取的 ID @ThomasAndolf 嗨。我的服务方法中有一个断点。它得到了正确的 ID。 Here my debugging process。我将在主要问题中编辑我的文档实体。 怎么样:c -&gt; computer.setId(id) @Valijon lemme 试试吧 @Valijon 实际上,它正在工作。但远非如此,它就像: c -> computer.setId(id);返回计算机; 【参考方案1】:

试试这个:

.map(c -> computer.setId(id); return computer;)

【讨论】:

以上是关于Spring Reactive Web 更新方法创建新记录而不是更新现有记录的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot加载REACTIVE程序过程

更新到 Spring 5.1 - java.lang.NoClassDefFoundError: org/springframework/http/server/reactive/ServletSer

Spring Reactive Web - 异常总是包含在 500 中

使用 Spring Boot WebFlux、Spring Data MongoDB Reactive 和 ReactiveMongoRepository 更新 1 个或多个特定字段 MongoDB

Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency(代码