【发布时间】: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);返回计算机;}
标签: java mongodb spring-boot reactive-programming spring-webflux