この記事では、Spring Cloud Azure と Spring Data を組み合わせて使用する方法について説明します。
Spring Data Azure Cosmos DB のサポート
Azure Cosmos DB は、開発者が SQL、MongoDB、Graph、Azure Table Storage などのさまざまな標準 API を使用してデータを操作できるようにするグローバル分散データベース サービスです。
依存関係のセットアップ
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>
構成
手記
セキュリティ プリンシパルを使用して、Azure リソースにアクセスするための Microsoft Entra ID で認証と承認を行う場合は、セキュリティ プリンシパルに Azure リソースにアクセスするための十分なアクセス許可が付与されていることを確認してください。 詳細については、「Microsoft Entra IDを使用してアクセスを承認する」を参照してください。
次の表に、spring-cloud-azure-starter-data-cosmosの構成可能なプロパティを示します。
| 財産 | 形容 |
|---|---|
| spring.cloud.azure.cosmos.enabled を |
Azure Cosmos DB サービスが有効かどうかを示す値。 既定値は trueです。 |
| spring.cloud.azure.cosmos.database を |
Azure Cosmos DB データベース ID。 |
| spring.cloud.azure.cosmos.endpoint を |
Azure Cosmos DB に接続する URI。 |
| spring.cloud.azure.cosmos.key を |
Azure Cosmos DB に接続するための PrivateKey。 |
| spring.cloud.azure.cosmos.credential.client-certificate-password を |
証明書ファイルのパスワード。 |
| spring.cloud.azure.cosmos.credential.client-certificate-path を |
Azure でサービス プリンシパル認証を実行するときに使用する PEM 証明書ファイルのパス。 |
| spring.cloud.azure.cosmos.credential.client-id を |
Azure でサービス プリンシパル認証を実行するときに使用するクライアント ID。 |
| spring.cloud.azure.cosmos.credential.client-secret を |
Azure でサービス プリンシパル認証を実行するときに使用するクライアント シークレット。 |
| spring.cloud.azure.cosmos.credential.managed-identity 対応の |
マネージド ID を有効にするかどうか。 既定値は falseです。 |
| spring.cloud.azure.cosmos.credential.password を |
Azure でユーザー名/パスワード認証を実行するときに使用するパスワード。 |
| spring.cloud.azure.cosmos.credential.username を |
Azure でユーザー名/パスワード認証を実行するときに使用するユーザー名。 |
| spring.cloud.azure.cosmos.populate-query-metrics を |
診断文字列とクエリ メトリックを設定するかどうかを示す値。 既定値は falseです。 |
| spring.cloud.azure.cosmos.consistency-レベル | Azure Cosmos DB の 整合性レベル。 |
主な概念
Spring Data サポートの主な概念を次の一覧に示します。
Spring Data
CrudRepositoryとReactiveCrudRepository。次の基本的な CRUD 機能が提供されます。- セーブ
- findAll
- ID による findOne
- deleteAll
- ID による削除
- エンティティの削除
Spring Data @Id 注釈。 ドメイン クラスのフィールドを Azure Cosmos DB ドキュメントの
idにマップするには、次の 2 つの方法があります。-
@Idを使用してドメイン クラスのフィールドに注釈を付けます。 このフィールドは、Azure Cosmos DB のドキュメントidにマップされます。 - このフィールドの名前を
idに設定します。 このフィールドは、Azure Cosmos DB のドキュメントidにマップされます。
手記
両方の方法を適用すると、
@Id注釈の優先度が高くなります。-
カスタム コレクション名。 既定では、コレクション名はユーザー ドメイン クラスのクラス名になります。 カスタマイズするには、ドメイン クラスに注釈
@Document(collection="myCustomCollectionName")を追加します。すべてです。Azure Cosmos DB パーティション
サポートします。 ドメイン クラスのフィールドをパーティション キー フィールドとして指定するには、 @PartitionKeyで注釈を付けます。 CRUD 操作を実行する場合は、パーティション値を指定します。 その他の例については、GitHub の AddressRepositoryIT.java を参照してください。Spring Data カスタム クエリ 検索操作 サポートします。
spring-boot-starter-data-restをサポートします。
ドメイン クラスで List 型と入れ子になった型をサポートします。
基本的な使用方法
秘密キーを使用して Azure Cosmos DB にアクセスする
Azure Cosmos DB を spring-cloud-azure-starter-data-cosmos に接続する最も簡単な方法は、主キーを使用することです。 次のプロパティを追加します。
spring:
cloud:
azure:
cosmos:
key: ${AZURE_COSMOS_KEY}
endpoint: ${AZURE_COSMOS_ENDPOINT}
database: ${AZURE_COSMOS_DATABASE}
エンティティを定義する
次の例に示すように、Azure Cosmos DB でエンティティをドキュメントとして定義します。
@Container(containerName = "mycollection")
public class User {
@Id
private String id;
private String firstName;
@PartitionKey
private String lastName;
private String address;
public User() {
}
public User(String id, String firstName, String lastName, String address) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return String.format("%s %s, %s", firstName, lastName, address);
}
}
id フィールドは、Azure Cosmos DB のドキュメント id として使用されます。 または、@Id を使用して任意のフィールドに注釈を付けて、ドキュメント idにマップすることもできます。
注釈 @Container(containerName = "mycollection") は、Azure Cosmos DB でドキュメントのコレクション名を指定するために使用されます。
リポジトリを作成する
リポジトリを作成するには、Spring Data リポジトリのサポートを提供する ReactiveCosmosRepository インターフェイスを拡張します。
@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {
Flux<User> findByFirstName(String firstName);
}
現在、ReactiveCosmosRepository インターフェイスでは、基本的な保存、削除、および検索操作が提供されています。 その他の操作は後でサポートされます。
アプリケーション クラスを作成する
次の例では、すべてのコンポーネントを含むアプリケーション クラスを作成します。
@SpringBootApplication
public class CosmosSampleApplication implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(CosmosSampleApplication.class);
@Autowired
private UserRepository repository;
@Autowired
private CosmosProperties properties;
public static void main(String[] args) {
SpringApplication.run(CosmosSampleApplication.class, args);
}
public void run(String... var1) {
final User testUser = new User("testId", "testFirstName",
"testLastName", "test address line one");
// Save the User class to Azure Cosmos DB database.
final Mono<User> saveUserMono = repository.save(testUser);
final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");
// Nothing happens until we subscribe to these Monos.
// findById won't return the user as user isn't present.
final Mono<User> findByIdMono = repository.findById(testUser.getId());
final User findByIdUser = findByIdMono.block();
Assert.isNull(findByIdUser, "User must be null");
final User savedUser = saveUserMono.block();
Assert.state(savedUser != null, "Saved user must not be null");
Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()),
"Saved user first name doesn't match");
firstNameUserFlux.collectList().block();
final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");
final User result = optionalUserResult.get();
Assert.state(result.getFirstName().equals(testUser.getFirstName()),
"query result firstName doesn't match!");
Assert.state(result.getLastName().equals(testUser.getLastName()),
"query result lastName doesn't match!");
LOGGER.info("findOne in User collection get result: {}", result.toString());
}
@PostConstruct
public void setup() {
// For this example, remove all of the existing records.
this.repository.deleteAll().block();
}
}
この例には、保存、削除、検索の各操作をサポートする自動ワイヤード UserRepository インターフェイスが含まれています。
サンプル
GitHub で azure-spring-boot-samples を参照してください。
spring-cloud-azure-starter-data-cosmos ライブラリを使用する以外に、azure-spring-data-cosmos ライブラリを直接使用して、より複雑なシナリオに対応できます。 詳細については、「Spring Data for Azure Cosmos DB クライアント ライブラリ」を参照してください。