Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive in che modo Spring Cloud Azure e Spring Data possono essere usati insieme.
Supporto di Spring Data per Azure Cosmos DB
azure Cosmos DB è un servizio di database distribuito a livello globale che consente agli sviluppatori di lavorare con i dati usando varie API standard, ad esempio SQL, MongoDB, Graph e Archiviazione tabelle di Azure.
Configurazione delle dipendenze
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>
Configurazione
Nota
Se si usa un'entità di sicurezza per eseguire l'autenticazione e l'autorizzazione con Microsoft Entra ID per accedere a una risorsa di Azure, assicurarsi che all'entità di sicurezza sia stata concessa l'autorizzazione sufficiente per accedere alla risorsa di Azure. Per altre informazioni, vedere Autorizzare l'accesso con Microsoft Entra ID.
Nella tabella seguente sono elencate le proprietà configurabili di spring-cloud-azure-starter-data-cosmos:
Concetti chiave
L'elenco seguente illustra i concetti chiave del supporto spring data:
Spring Data
CrudRepositoryeReactiveCrudRepository, che forniscono le funzionalità CRUD di base seguenti:- salvare
- trova tutto
- findOne per ID
- eliminaTutto
- elimina per ID
- eliminare un'entità
L'annotazione Spring Data @Id. Esistono due modi per eseguire il mapping di un campo in una classe di dominio alla
iddi un documento di Azure Cosmos DB:- Annotare un campo nella classe di dominio con
@Id. Questo campo verrà mappato al documentoidin Azure Cosmos DB. - Impostare il nome di questo campo su
id. Questo campo verrà mappato al documentoidin Azure Cosmos DB.
Nota
Se vengono applicati entrambi i modi, l'annotazione
@Idha priorità più alta.- Annotare un campo nella classe di dominio con
Nomi di raccolta personalizzati. Per impostazione predefinita, il nome della raccolta sarà il nome della classe di dominio utente. Per personalizzarla, aggiungere un'annotazione
@Document(collection="myCustomCollectionName")alla classe di dominio.Supporta partizione di Azure Cosmos DB. Per specificare un campo della classe di dominio come campo della chiave di partizione, annotarlo con
@PartitionKey. Quando si eseguono operazioni CRUD, specificare il valore della partizione. Per altri esempi, vedere AddressRepositoryIT.java su GitHub.Supporta l'operazione di ricerca query personalizzata di Spring Data.
Supporta
spring-boot-starter-data-rest.Supporta l'elenco e i tipi annidati nelle classi di dominio.
Utilizzo di base
Usare una chiave privata per accedere ad Azure Cosmos DB
Il modo più semplice per connettere Azure Cosmos DB con spring-cloud-azure-starter-data-cosmos è con una chiave primaria. Aggiungere le proprietà seguenti:
spring:
cloud:
azure:
cosmos:
key: ${AZURE_COSMOS_KEY}
endpoint: ${AZURE_COSMOS_ENDPOINT}
database: ${AZURE_COSMOS_DATABASE}
Definire un'entità
Definire un'entità come documento in Azure Cosmos DB, come illustrato nell'esempio seguente:
@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);
}
}
Il campo id verrà usato come documento id in Azure Cosmos DB. In alternativa, è possibile annotare qualsiasi campo con @Id per eseguirne il mapping al documento id.
L'annotazione @Container(containerName = "mycollection") viene usata per specificare il nome della raccolta del documento in Azure Cosmos DB.
Creare repository
Per creare repository, estendere l'interfaccia ReactiveCosmosRepository, che fornisce il supporto del repository Spring Data.
@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {
Flux<User> findByFirstName(String firstName);
}
Attualmente, l'interfaccia ReactiveCosmosRepository fornisce operazioni di salvataggio, eliminazione e ricerca di base. Altre operazioni saranno supportate in un secondo momento.
Creare una classe dell'applicazione
L'esempio seguente crea una classe applicazione con tutti i componenti:
@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();
}
}
Questo esempio include un'interfaccia UserRepository cablata per supportare operazioni di salvataggio, eliminazione e ricerca.
Campioni
Vedi azure-spring-boot-samples su GitHub.
Oltre a usare la libreria di spring-cloud-azure-starter-data-cosmos, è possibile usare direttamente azure-spring-data-cosmos libreria per scenari più complessi. Per altre informazioni, vedere Spring Data per la libreria client di Azure Cosmos DB.