Stöd för Spring Data

Den här artikeln beskriver hur Spring Cloud Azure och Spring Data kan användas tillsammans.

Stöd för Spring Data Azure Cosmos DB

Azure Cosmos DB är en globalt distribuerad databastjänst som gör att utvecklare kan arbeta med data med hjälp av olika standard-API:er, till exempel SQL, MongoDB, Graph och Azure Table Storage.

Beroendekonfiguration

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

Konfiguration

Not

Om du använder ett säkerhetsobjekt för att autentisera och auktorisera med Microsoft Entra-ID för åtkomst till en Azure-resurs måste du se till att säkerhetsobjektet har beviljats tillräcklig behörighet för att få åtkomst till Azure-resursen. Mer information finns i Auktorisera åtkomst med Microsoft Entra-ID.

I följande tabell visas de konfigurerbara egenskaperna för spring-cloud-azure-starter-data-cosmos:

Egenskap Beskrivning
spring.cloud.azure.cosmos.enabled Ett värde som anger om Azure Cosmos DB-tjänsten är aktiverad. Standardvärdet är true.
spring.cloud.azure.cosmos.database Azure Cosmos DB-databas-ID.
spring.cloud.azure.cosmos.endpoint URI:n för att ansluta Azure Cosmos DB.
spring.cloud.azure.cosmos.key PrivateKey för att ansluta Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Lösenordet för certifikatfilen.
spring.cloud.azure.cosmos.credential.client-certificate-path Sökvägen till en PEM-certifikatfil som ska användas vid autentisering med tjänstens huvudnamn med Azure.
spring.cloud.azure.cosmos.credential.client-id Det klient-ID som ska användas när du utför autentisering med tjänstens huvudnamn med Azure.
spring.cloud.azure.cosmos.credential.client-secret Klienthemligheten som ska användas när du utför autentisering med tjänstens huvudnamn med Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Om du vill aktivera hanterad identitet. Standardvärdet är false.
spring.cloud.azure.cosmos.credential.password Lösenordet som ska användas när du utför autentisering med användarnamn/lösenord med Azure.
spring.cloud.azure.cosmos.credential.username Användarnamnet som ska användas när du utför autentisering med användarnamn/lösenord med Azure.
spring.cloud.azure.cosmos.populate-query-metrics Ett värde som anger om diagnostiksträngar och frågemått ska fyllas i. Standardvärdet är false.
spring.cloud.azure.cosmos.consistency-level En konsekvensnivå för Azure Cosmos DB.

Viktiga begrepp

I följande lista visas huvudbegreppen för Spring Data-stödet:

  • Spring Data CrudRepository och ReactiveCrudRepository, som tillhandahåller följande grundläggande CRUD-funktioner:

    • spara
    • hittaAlla
    • findOne efter ID
    • radera alla
    • ta bort med ID
    • ta bort entitet
  • Spring Data-@Id kommentar. Det finns två sätt att mappa ett fält i en domänklass till id i ett Azure Cosmos DB-dokument:

    • Kommentera ett fält i domänklassen med @Id. Det här fältet mappas till dokument id i Azure Cosmos DB.
    • Ange namnet på fältet till id. Det här fältet mappas till dokument id i Azure Cosmos DB.

    Not

    Om båda sätten tillämpas har @Id anteckning högre prioritet.

  • Anpassade samlingsnamn. Samlingsnamnet är som standard klassnamnet för användardomänklassen. Om du vill anpassa den lägger du till anteckningar @Document(collection="myCustomCollectionName") till domänklassen, det är allt.

  • Stöder Azure Cosmos DB-partition. Om du vill ange att ett fält i domänklassen ska vara ett partitionsnyckelfält kommenterar du det med @PartitionKey. När du utför CRUD-åtgärder anger du partitionsvärdet. Fler exempel finns i AddressRepositoryIT.java på GitHub.

  • Stöder anpassad Spring Data-fråga sökåtgärd.

  • Stöder spring-boot-starter-data-rest.

  • Stöder listtyper och kapslade typer i domänklasser.

Grundläggande användning

Använda en privat nyckel för att få åtkomst till Azure Cosmos DB

Det enklaste sättet att ansluta Azure Cosmos DB med spring-cloud-azure-starter-data-cosmos är med en primärnyckel. Lägg till följande egenskaper:

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

Definiera en entitet

Definiera en entitet som ett dokument i Azure Cosmos DB, enligt följande exempel:

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

Fältet id används som dokument id i Azure Cosmos DB. Alternativt kan du kommentera valfritt fält med @Id för att mappa det till dokumentet id.

Kommentaren @Container(containerName = "mycollection") används för att ange samlingsnamnet för dokumentet i Azure Cosmos DB.

Skapa lagringsplatser

Om du vill skapa lagringsplatser utökar du ReactiveCosmosRepository-gränssnittet, vilket ger stöd för Spring Data-lagringsplatsen.

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

För närvarande tillhandahåller ReactiveCosmosRepository-gränssnittet grundläggande åtgärder för att spara, ta bort och hitta. Fler åtgärder kommer att stödjas senare.

Skapa en programklass

I följande exempel skapas en programklass med alla komponenter:

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

Det här exemplet innehåller ett autokodat UserRepository-gränssnitt som stöder åtgärder för att spara, ta bort och hitta.

Prover

Se på azure-spring-boot-samples GitHub.

Förutom att använda spring-cloud-azure-starter-data-cosmos-biblioteket kan du direkt använda azure-spring-data-cosmos-biblioteket för mer komplexa scenarier. Mer information finns i Spring Data för Azure Cosmos DB-klientbiblioteket.