1。はじめに
このチュートリアルでは、MongoDBを使用したSpring DataReactiveRepositoriesを介したReactiveProgrammingを使用してデータベース操作を構成および実装する方法を説明します。
ReactiveCrudの基本的な使用法について説明します。 リポジトリ、 ReactiveMongoRepository 、 ReactiveMongoTemplate。も同様です。
これらの実装はリアクティブプログラミングを使用していますが、それはこのチュートリアルの主な焦点ではありません。
2。環境
Reactive MongoDBを使用するには、依存関係をpom.xml。に追加する必要があります。
テスト用に組み込みのMongoDBも追加します:
<dependencies>
// ...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3。構成
リアクティブサポートを有効にするには、 @EnableReactiveMongoRepositoriesを使用する必要があります いくつかのインフラストラクチャのセットアップと一緒に:
@EnableReactiveMongoRepositories
public class MongoReactiveApplication
extends AbstractReactiveMongoConfiguration {
@Bean
public MongoClient mongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}
スタンドアロンのMongoDBインストールを使用している場合は、上記が必要になることに注意してください。ただし、この例ではMongoDBが埋め込まれたSpring Bootを使用しているため、上記の構成は必要ありません。
4。 ドキュメントの作成
以下の例では、アカウントを作成しましょう。 クラスを作成し、 @Documentで注釈を付けます データベース操作で使用するには:
@Document
public class Account {
@Id
private String id;
private String owner;
private Double value;
// getters and setters
}
5。リアクティブリポジトリの使用
リポジトリプログラミングモデルについてはすでによく知っており、CRUDメソッドはすでに定義されており、他の一般的なものもサポートされています。
これでリアクティブモデルを使用して、結果とパラメーターをリアクティブな方法で処理することを除いて、同じメソッドと仕様のセットを取得します。
5.1。 ReactiveCrudRepository
このリポジトリは、ブロッキング CrudRepositoryと同じように使用できます。 :
@Repository
public interface AccountCrudRepository
extends ReactiveCrudRepository<Account, String> {
Flux<Account> findAllByValue(String value);
Mono<Account> findFirstByOwner(Mono<String> owner);
}
プレーン(文字列)のようなさまざまなタイプの引数を渡すことができます )、ラップ(オプション 、ストリーム )、またはリアクティブ( Mono 、フラックス ) findFirstByOwner()で確認できるように メソッド。
5.2。 ReactiveMongoRepository
ReactiveMongoRepositoryもあります ReactiveCrudRepositoryから継承するインターフェイス いくつかの新しいクエリメソッドを追加します:
@Repository
public interface AccountReactiveRepository
extends ReactiveMongoRepository<Account, String> { }
ReactiveMongoRepositoryの使用 、例でクエリできます:
Flux<Account> accountFlux = repository
.findAll(Example.of(new Account(null, "owner", null)));
その結果、すべてのアカウントを取得します 渡された例と同じです。
リポジトリを作成すると、実装する必要のないデータベース操作を実行するためのメソッドがすでに定義されています。
Mono<Account> accountMono
= repository.save(new Account(null, "owner", 12.3));
Mono<Account> accountMono2 = repository
.findById("123456");
5.3。 RxJava2CrudRepository
RxJava2CrudRepository ReactiveCrudRepositoryと同じ動作をします ただし、 RxJavaの結果とパラメータタイプを使用します :
@Repository
public interface AccountRxJavaRepository
extends RxJava2CrudRepository<Account, String> {
Observable<Account> findAllByValue(Double value);
Single<Account> findFirstByOwner(Single<String> owner);
}
5.4。基本操作のテスト
リポジトリメソッドをテストするために、テストサブスクライバーを使用します:
@Test
public void givenValue_whenFindAllByValue_thenFindAccount() {
repository.save(new Account(null, "Bill", 12.3)).block();
Flux<Account> accountFlux = repository.findAllByValue(12.3);
StepVerifier
.create(accountFlux)
.assertNext(account -> {
assertEquals("Bill", account.getOwner());
assertEquals(Double.valueOf(12.3) , account.getValue());
assertNotNull(account.getId());
})
.expectComplete()
.verify();
}
@Test
public void givenOwner_whenFindFirstByOwner_thenFindAccount() {
repository.save(new Account(null, "Bill", 12.3)).block();
Mono<Account> accountMono = repository
.findFirstByOwner(Mono.just("Bill"));
StepVerifier
.create(accountMono)
.assertNext(account -> {
assertEquals("Bill", account.getOwner());
assertEquals(Double.valueOf(12.3) , account.getValue());
assertNotNull(account.getId());
})
.expectComplete()
.verify();
}
@Test
public void givenAccount_whenSave_thenSaveAccount() {
Mono<Account> accountMono = repository.save(new Account(null, "Bill", 12.3));
StepVerifier
.create(accountMono)
.assertNext(account -> assertNotNull(account.getId()))
.expectComplete()
.verify();
}
6。 ReactiveMongoTemplate
リポジトリアプローチに加えて、 ReactiveMongoTemplate 。
まず、 ReactiveMongoTemplateを登録する必要があります Beanとして:
@Configuration
public class ReactiveMongoConfig {
@Autowired
MongoClient mongoClient;
@Bean
public ReactiveMongoTemplate reactiveMongoTemplate() {
return new ReactiveMongoTemplate(mongoClient, "test");
}
}
次に、このBeanをサービスに注入して、データベース操作を実行できます。
@Service
public class AccountTemplateOperations {
@Autowired
ReactiveMongoTemplate template;
public Mono<Account> findById(String id) {
return template.findById(id, Account.class);
}
public Flux<Account> findAll() {
return template.findAll(Account.class);
}
public Mono<Account> save(Mono<Account> account) {
return template.save(account);
}
}
ReactiveMongoTemplate また、私たちが持っているドメインに関係のないいくつかのメソッドがあります。それらはドキュメントで確認できます。