Obsługa usługi Spring Data

W tym artykule opisano, jak platformy Spring Cloud i spring Data można używać razem.

Obsługa usługi Spring Data w usłudze Azure Cosmos DB

azure Cosmos DB to globalnie rozproszona usługa bazy danych, która umożliwia deweloperom pracę z danymi przy użyciu różnych standardowych interfejsów API, takich jak SQL, MongoDB, Graph i Azure Table Storage.

Konfiguracja zależności

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

Konfiguracja

Nuta

Jeśli używasz podmiotu zabezpieczeń do uwierzytelniania i autoryzacji za pomocą identyfikatora Entra firmy Microsoft na potrzeby uzyskiwania dostępu do zasobu platformy Azure, upewnij się, że podmiot zabezpieczeń otrzymał wystarczające uprawnienia dostępu do zasobu platformy Azure. Aby uzyskać więcej informacji, zobacz Authorize access with Microsoft Entra ID.

W poniższej tabeli wymieniono konfigurowalne właściwości spring-cloud-azure-starter-data-cosmos:

Własność Opis
spring.cloud.azure.cosmos.enabled Wartość wskazująca, czy usługa Azure Cosmos DB jest włączona. Wartość domyślna to true.
spring.cloud.azure.cosmos.database Identyfikator bazy danych usługi Azure Cosmos DB.
spring.cloud.azure.cosmos.endpoint Identyfikator URI umożliwiający połączenie z usługą Azure Cosmos DB.
spring.cloud.azure.cosmos.key Klucz prywatny łączący usługę Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Hasło pliku certyfikatu.
spring.cloud.azure.cosmos.credential.client-certificate-path Ścieżka pliku certyfikatu PEM do użycia podczas przeprowadzania uwierzytelniania jednostki usługi za pomocą platformy Azure.
spring.cloud.azure.cosmos.credential.client-id Identyfikator klienta do użycia podczas przeprowadzania uwierzytelniania jednostki usługi na platformie Azure.
spring.cloud.azure.cosmos.credential.client-secret Klucz tajny klienta używany podczas przeprowadzania uwierzytelniania jednostki usługi za pomocą platformy Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Czy włączyć tożsamość zarządzaną. Wartość domyślna to false.
spring.cloud.azure.cosmos.credential.password Hasło do użycia podczas uwierzytelniania nazwy użytkownika/hasła na platformie Azure.
spring.cloud.azure.cosmos.credential.username Nazwa użytkownika używana podczas przeprowadzania uwierzytelniania nazwy użytkownika/hasła na platformie Azure.
spring.cloud.azure.cosmos.populate-query-metrics Wartość wskazująca, czy wypełnić ciągi diagnostyczne i metryki zapytania. Wartość domyślna to false.
spring.cloud.azure.cosmos.consistency-level poziom spójności dla usługi Azure Cosmos DB.

Kluczowe pojęcia

Na poniższej liście przedstawiono kluczowe pojęcia dotyczące obsługi rozwiązania Spring Data:

  • CrudRepository Spring Data i ReactiveCrudRepository, które zapewniają następujące podstawowe funkcje CRUD:

    • zapisać
    • findAll
    • findOne według identyfikatora
    • usuńWszystko
    • usuń według identyfikatora
    • usuwanie jednostki
  • Adnotacja Spring Data @Id. Istnieją dwa sposoby mapowania pola w klasie domeny na id dokumentu usługi Azure Cosmos DB:

    • Dodawanie adnotacji do pola w klasie domeny przy użyciu @Id. To pole zostanie zamapowane na dokument id w usłudze Azure Cosmos DB.
    • Ustaw nazwę tego pola na id. To pole zostanie zamapowane na dokument id w usłudze Azure Cosmos DB.

    Nuta

    W przypadku zastosowania obu sposobów adnotacja @Id ma wyższy priorytet.

  • Nazwy kolekcji niestandardowych. Domyślnie nazwa kolekcji będzie nazwą klasy klasy domeny użytkownika. Aby go dostosować, dodaj adnotację @Document(collection="myCustomCollectionName") do klasy domeny, to wszystko.

  • Obsługuje partycji usługi Azure Cosmos DB. Aby określić pole klasy domeny jako pole klucza partycji, dodaj do niego adnotację przy użyciu @PartitionKey. Podczas wykonywania operacji CRUD określ wartość partycji. Aby uzyskać więcej przykładów, zobacz AddressRepositoryIT.java w witrynie GitHub.

  • Obsługuje niestandardowe zapytanie Spring Data operacji znajdowania.

  • Obsługuje element spring-boot-starter-data-rest.

  • Obsługuje typy list i zagnieżdżone w klasach domen.

Podstawowe użycie

Uzyskiwanie dostępu do usługi Azure Cosmos DB przy użyciu klucza prywatnego

Najprostszym sposobem łączenia usługi Azure Cosmos DB z spring-cloud-azure-starter-data-cosmos jest użycie klucza podstawowego. Dodaj następujące właściwości:

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

Definiowanie jednostki

Zdefiniuj jednostkę jako dokument w usłudze Azure Cosmos DB, jak pokazano w poniższym przykładzie:

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

Pole id będzie używane jako id dokumentu w usłudze Azure Cosmos DB. Alternatywnie możesz dodać adnotacje do dowolnego pola z @Id, aby zamapować je na dokument id.

Adnotacja @Container(containerName = "mycollection") służy do określania nazwy kolekcji dokumentu w usłudze Azure Cosmos DB.

Tworzenie repozytoriów

Aby utworzyć repozytoria, rozszerz interfejs ReactiveCosmosRepository, który zapewnia obsługę repozytorium Spring Data.

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

Obecnie interfejs ReactiveCosmosRepository zapewnia podstawowe operacje zapisywania, usuwania i znajdowania. Więcej operacji będzie obsługiwanych później.

Tworzenie klasy aplikacji

Poniższy przykład tworzy klasę aplikacji ze wszystkimi składnikami:

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

W tym przykładzie przedstawiono interfejs automatycznego UserRepository do obsługi operacji zapisywania, usuwania i znajdowania.

Próbki

Zobacz w witrynie azure-spring-boot-samples GitHub.

Oprócz korzystania z biblioteki spring-cloud-azure-starter-data-cosmos można bezpośrednio użyć biblioteki azure-spring-data-cosmos w bardziej złożonych scenariuszach. Aby uzyskać więcej informacji, zobacz Spring Data for Azure Cosmos DB client library.