【问题标题】:Spring Reactive Web update method makes a new record instead of update the existing oneSpring Reactive Web 更新方法创建新记录而不是更新现有记录
【发布时间】: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);返回计算机;}

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


【解决方案1】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2023-01-12
    • 2010-11-23
    • 2012-07-25
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多