Spring Data-ondersteuning

In dit artikel wordt beschreven hoe Spring Cloud Azure en Spring Data samen kunnen worden gebruikt.

Ondersteuning voor Spring Data Azure Cosmos DB

Azure Cosmos DB is een wereldwijd gedistribueerde databaseservice waarmee ontwikkelaars met gegevens kunnen werken met behulp van verschillende standaard-API's, zoals SQL, MongoDB, Graph en Azure Table Storage.

Afhankelijkheid instellen

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

Configuratie

Notitie

Als u een beveiligingsprincipaal gebruikt om te verifiëren en autoriseren met Microsoft Entra ID voor toegang tot een Azure-resource, moet u ervoor zorgen dat aan de beveiligingsprincipaal voldoende machtigingen zijn verleend voor toegang tot de Azure-resource. Zie Toegang autoriseren met Microsoft Entra IDvoor meer informatie.

De volgende tabel bevat de configureerbare eigenschappen van spring-cloud-azure-starter-data-cosmos:

Eigenschap Beschrijving
spring.cloud.azure.cosmos.enabled Een waarde die aangeeft of Azure Cosmos DB Service is ingeschakeld. De standaardwaarde is true.
spring.cloud.azure.cosmos.database Het Azure Cosmos DB-database-id.
spring.cloud.azure.cosmos.endpoint De URI om Verbinding te maken met Azure Cosmos DB.
spring.cloud.azure.cosmos.key De PrivateKey om Verbinding te maken met Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Het wachtwoord van het certificaatbestand.
spring.cloud.azure.cosmos.credential.client-certificate-path Het pad naar een PEM-certificaatbestand dat moet worden gebruikt bij service-principalverificatie met Azure.
spring.cloud.azure.cosmos.credential.client-id De client-id die moet worden gebruikt bij het uitvoeren van service-principal-verificatie met Azure.
spring.cloud.azure.cosmos.credential.client-secret Het clientgeheim dat moet worden gebruikt bij het uitvoeren van service-principal-verificatie met Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Of beheerde identiteit moet worden ingeschakeld. De standaardwaarde is false.
spring.cloud.azure.cosmos.credential.password Het wachtwoord dat moet worden gebruikt bij het uitvoeren van verificatie met gebruikersnaam en wachtwoord met Azure.
spring.cloud.azure.cosmos.credential.username De gebruikersnaam die moet worden gebruikt bij het uitvoeren van verificatie met gebruikersnaam en wachtwoord met Azure.
spring.cloud.azure.cosmos.populate-query-metrics Een waarde die aangeeft of diagnostische tekenreeksen en metrische querygegevens moeten worden ingevuld. De standaardwaarde is false.
spring.cloud.azure.cosmos.consistency-level Een consistentieniveau voor Azure Cosmos DB.

Sleutelbegrippen

In de volgende lijst ziet u de belangrijkste concepten van de Spring Data-ondersteuning:

  • De Spring Data-CrudRepository en ReactiveCrudRepository, die de volgende eenvoudige CRUD-functionaliteit bieden:

    • opslaan
    • vindAlles
    • vindEén op ID
    • verwijderAlles
    • verwijderen op basis van ID
    • entiteit verwijderen
  • De Spring Data @Id aantekening. Er zijn twee manieren om een veld in een domeinklasse toe te wijzen aan de id van een Azure Cosmos DB-document:

    • Aantekeningen toevoegen aan een veld in domeinklasse met @Id. Dit veld wordt toegewezen aan document id in Azure Cosmos DB.
    • Stel de naam van dit veld in op id. Dit veld wordt toegewezen aan document id in Azure Cosmos DB.

    Notitie

    Als beide manieren worden toegepast, heeft de @Id aantekening een hogere prioriteit.

  • Aangepaste verzamelingsnamen. De verzamelingsnaam is standaard de klassenaam van de gebruikersdomeinklasse. Als u deze wilt aanpassen, voegt u aantekeningen toe @Document(collection="myCustomCollectionName") aan uw domeinklasse, dat is alles.

  • Ondersteunt Azure Cosmos DB-partitie. Als u een veld van uw domeinklasse wilt opgeven als een partitiesleutelveld, moet u er aantekeningen aan toevoegen met @PartitionKey. Wanneer u CRUD-bewerkingen uitvoert, geeft u de partitiewaarde op. Zie AddressRepositoryIT.java op GitHub voor meer voorbeelden.

  • Ondersteunt aangepaste Spring Data-query zoekbewerking.

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

  • Ondersteunt lijsttypen en geneste typen in domeinklassen.

Basisgebruik

Een persoonlijke sleutel gebruiken voor toegang tot Azure Cosmos DB

De eenvoudigste manier om Azure Cosmos DB te verbinden met spring-cloud-azure-starter-data-cosmos is met een primaire sleutel. Voeg de volgende eigenschappen toe:

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

Een entiteit definiëren

Definieer een entiteit als een document in Azure Cosmos DB, zoals wordt weergegeven in het volgende voorbeeld:

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

Het veld id wordt gebruikt als het document id in Azure Cosmos DB. U kunt ook aantekeningen toevoegen aan elk veld met @Id om het toe te wijzen aan het document id.

De aantekening @Container(containerName = "mycollection") wordt gebruikt om de naam van de verzameling van uw document in Azure Cosmos DB op te geven.

Opslagplaatsen maken

Als u opslagplaatsen wilt maken, kunt u de ReactiveCosmosRepository-interface uitbreiden, die ondersteuning biedt voor Spring Data-opslagplaatsen.

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

Op dit moment biedt de ReactiveCosmosRepository interface eenvoudige bewerkingen voor opslaan, verwijderen en zoeken. Later worden meer bewerkingen ondersteund.

Een toepassingsklasse maken

In het volgende voorbeeld wordt een toepassingsklasse gemaakt met alle onderdelen:

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

Dit voorbeeld bevat een autowired UserRepository interface ter ondersteuning van bewerkingen voor opslaan, verwijderen en zoeken.

Voorbeelden

Bekijk de azure-spring-boot-samples op GitHub.

Naast het gebruik van de spring-cloud-azure-starter-data-cosmos-bibliotheek kunt u azure-spring-data-cosmos bibliotheek rechtstreeks gebruiken voor complexere scenario's. Zie Spring Data voor Azure Cosmos DB-clientbibliotheekvoor meer informatie.