使用 spring 数据 mongodb 更新对象并且 kotlin 不工作
updating object with spring data mongodb and kotlin is not working
我有以下请求处理程序
fun x(req: ServerRequest) = req.toMono()
.flatMap {
...
val oldest = myRepository.findOldest(...) // this is the object I want to modify
...
val v= anotherMongoReactiveRepository.save(Y(...)) // this saves successfully
myRepository.save(oldest.copy(
remaining = (oldest.remaining - 1)
)) // this is not saved
ok().body(...)
}
和以下 mongodb 反应式存储库
@Repository
interface MyRepository : ReactiveMongoRepository<X, String>, ... {
}
问题是save()
方法执行后对象没有变化。我设法用 save().block()
解决了这个问题,但我不知道为什么第一次保存在另一个存储库上有效,而这个却不行。为什么需要 block()
?
在有人订阅反应式发布者之前,什么都不会发生。这就是当您使用 block() 时它开始工作的原因。如果您需要调用 DB 并在另一个 DB 请求中使用结果,而不是使用 Mono / Flux 运算符,如 map()、flatMap()... 来构建您需要的所有操作的管道,然后 return 产生的 Mono / Flux 作为控制器的响应。 Spring 将订阅该 Mono / Flux 并将 return 请求。你不需要阻止它。并且不建议这样做(使用 block() 方法)。
如何使用 Java 中的 MongoDB 响应式存储库的简短示例:
@GetMapping("/users")
public Mono<User> getPopulation() {
return userRepository.findOldest()
.flatMap(user -> { // process the response from DB
user.setTheOldest(true);
return userRepository.save(user);
})
.map(user -> {...}); // another processing
}
我有以下请求处理程序
fun x(req: ServerRequest) = req.toMono()
.flatMap {
...
val oldest = myRepository.findOldest(...) // this is the object I want to modify
...
val v= anotherMongoReactiveRepository.save(Y(...)) // this saves successfully
myRepository.save(oldest.copy(
remaining = (oldest.remaining - 1)
)) // this is not saved
ok().body(...)
}
和以下 mongodb 反应式存储库
@Repository
interface MyRepository : ReactiveMongoRepository<X, String>, ... {
}
问题是save()
方法执行后对象没有变化。我设法用 save().block()
解决了这个问题,但我不知道为什么第一次保存在另一个存储库上有效,而这个却不行。为什么需要 block()
?
在有人订阅反应式发布者之前,什么都不会发生。这就是当您使用 block() 时它开始工作的原因。如果您需要调用 DB 并在另一个 DB 请求中使用结果,而不是使用 Mono / Flux 运算符,如 map()、flatMap()... 来构建您需要的所有操作的管道,然后 return 产生的 Mono / Flux 作为控制器的响应。 Spring 将订阅该 Mono / Flux 并将 return 请求。你不需要阻止它。并且不建议这样做(使用 block() 方法)。
如何使用 Java 中的 MongoDB 响应式存储库的简短示例:
@GetMapping("/users")
public Mono<User> getPopulation() {
return userRepository.findOldest()
.flatMap(user -> { // process the response from DB
user.setTheOldest(true);
return userRepository.save(user);
})
.map(user -> {...}); // another processing
}