2017-11-11 75 views
0

我开始使用Spring Webflux + MongoDB中的简单项目。Spring webflux,mongodb:文档没有保存到数据库中

我很难理解为什么这个代码保存对象用户到数据库:

@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"; 
    } 

文档没有保存在所有。

在第一种情况中,记录表示:

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 

并且在所述第二例子中,没有记录在所有。

ReactiveUserRepository是空的接口扩展ReactiveCrudRepository这样的:

@Repository 
public interface ReactiveUserRepository extends ReactiveCrudRepository<User, Long> { 

} 

我明白了,我可以用它代替ReactiveCrudRepository MongoRepository,这将正常工作。问题是,为什么将文档保存到数据库取决于方法的返回类型。

回答

3

在第二个片段中没有订阅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)返回单。这将订阅单声道并等待结果。

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

+0

这是推荐的,就像我应该在保存时阻塞? – StackTraceYo

相关问题