2017-11-11 107 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

相關問題