Podpora Spring Data

Tento článek popisuje, jak je možné společně používat Spring Cloud Azure a Spring Data.

Podpora služby Spring Data Azure Cosmos DB

azure Cosmos DB je globálně distribuovaná databázová služba, která vývojářům umožňuje pracovat s daty pomocí různých standardních rozhraní API, jako jsou SQL, MongoDB, Graph a Azure Table Storage.

Nastavení závislostí

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

Konfigurace

Poznámka

Pokud k ověřování a autorizaci pomocí ID Microsoft Entra pro přístup k prostředku Azure používáte objekt zabezpečení, ujistěte se, že objekt zabezpečení má dostatečná oprávnění pro přístup k prostředku Azure. Další informace naleznete v tématu Autorizace přístupu pomocí microsoft Entra ID.

Následující tabulka uvádí konfigurovatelné vlastnosti spring-cloud-azure-starter-data-cosmos:

Vlastnost Popis
spring.cloud.azure.cosmos.enabled Hodnota, která označuje, jestli je povolená služba Azure Cosmos DB. Výchozí hodnota je true.
spring.cloud.azure.cosmos.database ID databáze Azure Cosmos DB.
spring.cloud.azure.cosmos.endpoint Identifikátor URI pro připojení služby Azure Cosmos DB.
spring.cloud.azure.cosmos.key Privátní klíč pro připojení služby Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Heslo souboru certifikátu.
spring.cloud.azure.cosmos.credential.client-certificate-path Cesta k souboru certifikátu PEM, který se má použít při ověřování instančního objektu v Azure.
spring.cloud.azure.cosmos.credential.client-id ID klienta, které se má použít při ověřování instančního objektu v Azure.
spring.cloud.azure.cosmos.credential.client-secret Tajný klíč klienta, který se má použít při ověřování instančního objektu v Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Určuje, jestli chcete povolit spravovanou identitu. Výchozí hodnota je false.
spring.cloud.azure.cosmos.credential.password Heslo, které se má použít při ověřování pomocí uživatelského jména a hesla v Azure.
spring.cloud.azure.cosmos.credential.username Uživatelské jméno, které se má použít při ověřování pomocí uživatelského jména a hesla v Azure.
spring.cloud.azure.cosmos.populate-query-metrics Hodnota, která označuje, jestli se mají naplnit diagnostické řetězce a metriky dotazů. Výchozí hodnota je false.
spring.cloud.azure.cosmos.consistency-level Úroveň konzistence pro službu Azure Cosmos DB.

Klíčové koncepty

Následující seznam ukazuje klíčové koncepty podpory Spring Data:

  • Spring Data CrudRepository a ReactiveCrudRepository, které poskytují následující základní funkce CRUD:

    • uložit
    • nalezniVše
    • najítJedno podle ID
    • smazat vše
    • odstranit podle ID
    • smazat entitu
  • Poznámka k @Id Spring Data Pole ve třídě domény můžete mapovat dvěma způsoby na id dokumentu Azure Cosmos DB:

    • Přidání poznámek k poli ve třídě domény pomocí @Id. Toto pole se mapuje na dokument id ve službě Azure Cosmos DB.
    • Nastavte název tohoto pole na id. Toto pole se mapuje na dokument id ve službě Azure Cosmos DB.

    Poznámka

    Pokud se použijí oba způsoby, má @Id poznámka vyšší prioritu.

  • Názvy vlastních kolekcí Ve výchozím nastavení bude název kolekce název třídy uživatelské domény. Pokud ho chcete přizpůsobit, přidejte poznámku @Document(collection="myCustomCollectionName") do vaší třídy domény, to je vše.

  • Podporuje oddílu služby Azure Cosmos DB . Pokud chcete zadat pole vaší třídy domény, které má být polem klíče oddílu, anotujte ho pomocí @PartitionKey. Při operacích CRUD zadejte hodnotu oddílu. Další příklady najdete v tématu AddressRepositoryIT.java na GitHubu.

  • Podporuje operaci hledání vlastních dotazů Spring Data.

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

  • Podporuje seznam a vnořené typy v třídách domény.

Základní využití

Použití privátního klíče pro přístup ke službě Azure Cosmos DB

Nejjednodušší způsob připojení služby Azure Cosmos DB s spring-cloud-azure-starter-data-cosmos je s primárním klíčem. Přidejte následující vlastnosti:

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

Definování entity

Definujte entitu jako dokument ve službě Azure Cosmos DB, jak je znázorněno v následujícím příkladu:

@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 se použije jako id dokumentu ve službě Azure Cosmos DB. Alternativně můžete anotovat libovolné pole pomocí @Id a mapovat ho na dokument id.

Poznámka @Container(containerName = "mycollection") slouží k zadání názvu kolekce dokumentu ve službě Azure Cosmos DB.

Vytváření úložišť

Pokud chcete vytvářet úložiště, rozšiřte rozhraní ReactiveCosmosRepository, které poskytuje podporu úložiště Spring Data.

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

Rozhraní ReactiveCosmosRepository v současné době poskytuje základní operace ukládání, odstraňování a hledání. Další operace budou podporovány později.

Vytvoření třídy aplikace

Následující příklad vytvoří třídu aplikace se všemi komponentami:

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

Tento příklad obsahuje rozhraní UserRepository s automatickým rozhraním pro podporu operací ukládání, odstraňování a hledání.

Vzorky

Podívejte se na azure-spring-boot-samples GitHub.

Kromě použití knihovny spring-cloud-azure-starter-data-cosmos můžete přímo použít knihovnu azure-spring-data-cosmos pro složitější scénáře. Další informace najdete v tématu Spring Data pro klientskou knihovnu Azure Cosmos DB.