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 -> computer.setId(id)
@Valijon lemme 试试吧
@Valijon 实际上,它正在工作。但远非如此,它就像: c -> computer.setId(id);返回计算机;
【参考方案1】:
试试这个:
.map(c -> computer.setId(id); return computer;)
【讨论】:
以上是关于Spring Reactive Web 更新方法创建新记录而不是更新现有记录的主要内容,如果未能解决你的问题,请参考以下文章
更新到 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(代码