Spring webflux,mongodb:文档未保存到数据库中

时间:2017-11-11 13:30:27

标签: java spring mongodb

我开始使用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取决于方法返回类型。

1 个答案:

答案 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中。这将订阅单声道并等待结果。

在第一个片段弹簧中自动订阅结果,这就是它执行的原因。