我开始使用Spring Webflux + MongoDB中的简单项目。
我很难理解为什么这段代码会将对象用户保存到数据库中:
> library(jsonlite)
> toJSON(dt_split, dataframe = "columns", pretty=TRUE)
{
"Alabama": {
"Hoover": {
"x": [1, 2],
"y": [5, 6]
},
"Dothan": {
"x": [3],
"y": [7]
}
},
"Alsaka": {
"Chugiak": {
"x": [4],
"y": [8]
}
}
}
当我用这个替换上面的函数时:
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping(value="/signup", method = RequestMethod.POST)
@ResponseBody Mono<User> save(@ModelAttribute(value="user") User user){
return reactiveUserRepository.save(user);
}
}
}
文档根本没有存储。
在第一种情况下,日志记录显示:
@RequestMapping(value="/signup", method = RequestMethod.POST)
String save(@ModelAttribute(value="user") User user){
reactiveUserRepository.save(user);
return "login";
}
并且在第二个示例中根本没有记录。
ReactiveUserRepository是空接口,扩展了ReactiveCrudRepository,如下所示:
2017-11-11 14:20:29.654 DEBUG 2828 --- [ctor-http-nio-2] o.s.d.m.core.ReactiveMongoTemplate : Inserting Document containing fields: [_class] in collection: users
我明白,我可以使用MongoRepository而不是ReactiveCrudRepository,这将起作用。问题是,为什么将文档保存到DB取决于方法返回类型。
答案 0 :(得分:5)
在第二个代码段中没有订阅Mono<User>
(由.save(user)
返回);当没有订阅时,反应堆没有任何反应。
@RequestMapping(value = "/signup", method = RequestMethod.POST)
String save(@ModelAttribute(value = "user") User user) {
User user = reactiveUserRepository.save(user).block();
return "login";
}
您可以将Mono.block()
运算符添加到由save(user)
返回的Mono中。这将订阅单声道并等待结果。
在第一个片段弹簧中自动订阅结果,这就是它执行的原因。