2017-11-11 15 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を使用することができ、それが動作することを、理解しています。問題は、なぜ文書をDBに保存するのがメソッドの戻り値の型に依存するのかです。

答えて

3

Mono<User>(これは.save(user)によって返されます)の購読は2番目のスニペットにありません。サブスクリプションがなければ、原子炉では何も起こらない。

@RequestMapping(value = "/signup", method = RequestMethod.POST) 
String save(@ModelAttribute(value = "user") User user) { 
    User user = reactiveUserRepository.save(user).block(); 
    return "login"; 
} 

あなたはsave(user)によって返されるモノにMono.block()オペレータを追加することができます。これはモノをサブスクライブし、結果を待つでしょう。

最初のスニペットでは、springが結果を自動的に購読しているので、それが実行されます。

+0

これはおすすめです。保存するときにブロックするといいですか? – StackTraceYo

関連する問題