Поделиться через


Поддержка Spring Data

В этой статье описывается, как azure Spring Cloud и Spring Data можно использовать вместе.

Поддержка Spring Data Azure Cosmos DB

Azure Cosmos DB — это глобально распределенная служба баз данных, которая позволяет разработчикам работать с данными с помощью различных стандартных API, таких как SQL, MongoDB, Graph и хранилище таблиц Azure.

Настройка зависимостей

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

Конфигурация

Заметка

Если вы используете субъект безопасности для проверки подлинности и авторизации с помощью идентификатора Microsoft Entra для доступа к ресурсу Azure, убедитесь, что субъект безопасности предоставлен достаточно разрешений для доступа к ресурсу Azure. Дополнительные сведения см. в разделе Авторизация доступа с помощьюидентификатора Microsoft Entra.

В следующей таблице перечислены настраиваемые свойства spring-cloud-azure-starter-data-cosmos:

Свойство Описание
spring.cloud.azure.cosmos.enabled Значение, указывающее, включена ли служба Azure Cosmos DB. Значение по умолчанию — true.
spring.cloud.azure.cosmos.database Идентификатор базы данных Azure Cosmos DB.
spring.cloud.azure.cosmos.endpoint Универсальный код ресурса (URI) для подключения к Azure Cosmos DB.
Spring.cloud.azure.cosmos.key PrivateKey для подключения к Azure Cosmos DB.
spring.cloud.azure.cosmos.credential.client-certificate-password Пароль файла сертификата.
spring.cloud.azure.cosmos.credential.client-certificate-path Путь к файлу сертификата PEM, используемому при выполнении проверки подлинности субъекта-службы с помощью Azure.
spring.cloud.azure.cosmos.credential.client-id Идентификатор клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure.
spring.cloud.azure.cosmos.credential.client-secret Секрет клиента, используемый при проверке подлинности субъекта-службы с помощью Azure.
spring.cloud.azure.cosmos.credential.managed-identity-enabled Следует ли включить управляемое удостоверение. Значение по умолчанию — false.
spring.cloud.azure.cosmos.credential.password Пароль, используемый при выполнении проверки подлинности имени пользователя или пароля в Azure.
spring.cloud.azure.cosmos.credential.username Имя пользователя, используемое при выполнении проверки подлинности имени пользователя и пароля в Azure.
spring.cloud.azure.cosmos.populate-query-metrics Значение, указывающее, заполнять ли строки диагностики и метрики запросов. Значение по умолчанию — false.
spring.cloud.azure.cosmosуровня согласованности Уровень согласованности для Azure Cosmos DB.

Основные понятия

В следующем списке показаны основные понятия поддержки Spring Data:

  • CrudRepository Spring Data и ReactiveCrudRepository, которые предоставляют следующие основные функциональные возможности CRUD:

    • спасать
    • findAll (найти все)
    • НайтиОдин по идентификатору
    • удалить все
    • Удаление по идентификатору
    • Удаление сущности
  • Заметка spring Data @Id. Существует два способа сопоставления поля в классе домена с id документа Azure Cosmos DB:

    • Заметите поле в классе домена с @Id. Это поле будет сопоставлено с документом id в Azure Cosmos DB.
    • Задайте для этого поля значение id. Это поле будет сопоставлено с документом id в Azure Cosmos DB.

    Заметка

    Если применяются оба способа, @Id заметка имеет более высокий приоритет.

  • Имена пользовательских коллекций. По умолчанию имя коллекции будет классом класса класса домена пользователя. Чтобы настроить его, добавьте заметки @Document(collection="myCustomCollectionName") в класс домена, это все.

  • Поддерживает секции Azure Cosmos DB. Чтобы указать поле класса домена, чтобы быть полем ключа секции, заметьте его с помощью @PartitionKey. При выполнении операций CRUD укажите значение секции. Дополнительные примеры см. в AddressRepositoryIT.java на сайте GitHub.

  • Поддерживает пользовательские запросы Spring Data операции поиска.

  • Поддерживает spring-boot-starter-data-rest.

  • Поддерживает список и вложенные типы в классах домена.

Базовое использование

Использование закрытого ключа для доступа к Azure Cosmos DB

Самый простой способ подключения Azure Cosmos DB к spring-cloud-azure-starter-data-cosmos — это первичный ключ. Добавьте следующие свойства:

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

Определение сущности

Определите сущность как документ в Azure Cosmos DB, как показано в следующем примере:

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

Поле id будет использоваться в качестве документа id в Azure Cosmos DB. Кроме того, вы можете анонимировать любое поле с @Id, чтобы сопоставить его с документом id.

Заметка @Container(containerName = "mycollection") используется для указания имени коллекции документа в Azure Cosmos DB.

Создание репозиториев

Чтобы создать репозитории, расширьте интерфейс ReactiveCosmosRepository, который обеспечивает поддержку репозитория Spring Data.

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

В настоящее время интерфейс ReactiveCosmosRepository предоставляет основные операции сохранения, удаления и поиска. Дополнительные операции будут поддерживаться позже.

Создание класса приложения

В следующем примере создается класс приложения со всеми компонентами:

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

В этом примере включается автоматический интерфейс UserRepository для поддержки операций сохранения, удаления и поиска.

Образцы

См. azure-spring-boot-samples на сайте GitHub.

Помимо использования библиотеки spring-cloud-azure-starter-data-cosmos, вы можете напрямую использовать библиотеку azure-spring-data-cosmos для более сложных сценариев. Дополнительные сведения см. в Spring Data для клиентской библиотеки Azure Cosmos DB.