Dukungan Spring Data

Artikel ini menjelaskan bagaimana Spring Cloud Azure dan Spring Data dapat digunakan bersama-sama.

Dukungan Spring Data Azure Cosmos DB

Azure Cosmos DB adalah layanan database terdistribusi secara global yang memungkinkan pengembang untuk bekerja dengan data menggunakan berbagai API standar, seperti SQL, MongoDB, Graph, dan penyimpanan Azure Table.

Penyiapan dependensi

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>

Konfigurasi

Nota

Jika Anda menggunakan prinsip keamanan untuk mengautentikasi dan mengotorisasi dengan ID Microsoft Entra untuk mengakses sumber daya Azure, pastikan prinsip keamanan telah diberikan izin yang memadai untuk mengakses sumber daya Azure. Untuk informasi selengkapnya, lihat Mengotorisasi akses dengan ID Microsoft Entra.

Tabel berikut mencantumkan properti spring-cloud-azure-starter-data-cosmosyang dapat dikonfigurasi :

Harta benda Deskripsi
spring.cloud.azure.cosmos.enabled Nilai yang menunjukkan apakah Layanan Azure Cosmos DB diaktifkan. Nilai defaultnya adalah true.
spring.cloud.azure.cosmos.database ID database Azure Cosmos DB.
spring.cloud.azure.cosmos.endpoint URI untuk menyambungkan Azure Cosmos DB.
spring.cloud.azure.cosmos.key PrivateKey untuk menyambungkan Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Kata sandi file sertifikat.
spring.cloud.azure.cosmos.credential.client-certificate-path Jalur file sertifikat PEM yang akan digunakan saat melakukan autentikasi perwakilan layanan dengan Azure.
spring.cloud.azure.cosmos.credential.client-id ID klien yang akan digunakan saat melakukan autentikasi perwakilan layanan dengan Azure.
spring.cloud.azure.cosmos.credential.client-secret Rahasia klien untuk digunakan saat melakukan autentikasi perwakilan layanan dengan Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Apakah akan mengaktifkan identitas terkelola. Nilai defaultnya adalah false.
spring.cloud.azure.cosmos.credential.password Kata sandi yang digunakan saat melakukan autentikasi nama pengguna/kata sandi dengan Azure.
spring.cloud.azure.cosmos.credential.username Nama pengguna yang akan digunakan saat melakukan autentikasi nama pengguna/kata sandi dengan Azure.
spring.cloud.azure.cosmos.populate-query-metrics Nilai yang menunjukkan apakah akan mengisi string diagnostik dan metrik kueri. Nilai defaultnya adalah false.
spring.cloud.azure.cosmos.consistency-level Tingkat konsistensi untuk Azure Cosmos DB.

Konsep utama

Daftar berikut menunjukkan konsep utama dukungan Spring Data:

  • Spring Data CrudRepository dan ReactiveCrudRepository, yang menyediakan fungsionalitas CRUD dasar berikut:

    • simpan
    • temukanSemua
    • findOne berdasarkan ID
    • hapusSemua
    • hapus menurut ID
    • hapus entitas
  • Anotasi @Id Spring Data. Ada dua cara untuk memetakan bidang di kelas domain ke id dokumen Azure Cosmos DB:

    • Buat anotasi bidang di kelas domain dengan @Id. Bidang ini akan dipetakan ke id dokumen di Azure Cosmos DB.
    • Atur nama bidang ini ke id. Bidang ini akan dipetakan ke id dokumen di Azure Cosmos DB.

    Nota

    Jika kedua cara diterapkan, anotasi @Id memiliki prioritas yang lebih tinggi.

  • Nama koleksi kustom. Secara default, nama koleksi akan menjadi nama kelas kelas domain pengguna. Untuk menyesuaikannya, tambahkan anotasi @Document(collection="myCustomCollectionName") ke kelas domain Anda, itu saja.

  • Mendukungpartisi Azure Cosmos DB . Untuk menentukan bidang kelas domain Anda menjadi bidang kunci partisi, anotasi dengan @PartitionKey. Saat Anda melakukan operasi CRUD, tentukan nilai partisi Anda. Untuk contoh selengkapnya, lihat AddressRepositoryIT.java di GitHub.

  • Mendukung kueri kustom Spring Data menemukan operasi.

  • Mendukung spring-boot-starter-data-rest.

  • Mendukung Daftar dan jenis berlapis di kelas domain.

Penggunaan dasar

Menggunakan kunci privat untuk mengakses Azure Cosmos DB

Cara paling sederhana untuk menghubungkan Azure Cosmos DB dengan spring-cloud-azure-starter-data-cosmos adalah dengan kunci primer. Tambahkan properti berikut:

spring:
  cloud:
    azure:
      cosmos:
        key: ${AZURE_COSMOS_KEY}
        endpoint: ${AZURE_COSMOS_ENDPOINT}
        database: ${AZURE_COSMOS_DATABASE}

Menentukan entitas

Tentukan entitas sebagai Dokumen di Azure Cosmos DB, seperti yang ditunjukkan dalam contoh berikut:

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

Bidang id akan digunakan sebagai id dokumen di Azure Cosmos DB. Secara bergantian, Anda dapat membuat anotasi bidang apa pun dengan @Id untuk memetakannya ke dokumen id.

Anotasi @Container(containerName = "mycollection") digunakan untuk menentukan nama koleksi dokumen Anda di Azure Cosmos DB.

Membuat repositori

Untuk membuat repositori, perluas antarmuka ReactiveCosmosRepository, yang menyediakan dukungan repositori Spring Data.

@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {
    Flux<User> findByFirstName(String firstName);
}

Saat ini, antarmuka ReactiveCosmosRepository menyediakan operasi simpan, hapus, dan temukan dasar. Lebih banyak operasi akan didukung nanti.

Membuat kelas aplikasi

Contoh berikut membuat kelas aplikasi dengan semua komponen:

@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();
    }
}

Contoh ini mencakup antarmuka UserRepository otomatis untuk mendukung operasi simpan, hapus, dan temukan.

Sampel

Lihat di azure-spring-boot-samples GitHub.

Selain menggunakan pustaka spring-cloud-azure-starter-data-cosmos, Anda dapat langsung menggunakan pustaka azure-spring-data-cosmos untuk skenario yang lebih kompleks. Untuk informasi selengkapnya, lihat Spring Data untuk pustaka klien Azure Cosmos DB.