Chapitre Quarkus et la Persistance
Intégration de Quarkus avec NoSQL
Dans ce cours, nous allons apprendre à intégrer Quarkus avec le Cloud et une base NoSQL.
Objectifs
Dans cette leçon, nous allons tester quelques intégrations mineures Quarkus avec le Cloud.
Pour simplifier, nous allons utiliser dans notre cas GCP, et une base NoSQL Google Cloud Firestore.
La base sera fournie pour le TP ou bien vous devrez la créer vous-même.
Installation de l'extension Firestore
La documentation de l'extension est ici.
Pour ajouter cette extension à votre projet, utilisez la commande appropriée dans le répertoire de votre projet Quarkus :
Quarkus CLI
quarkus ext add io.quarkiverse.googlecloudservices:quarkus-google-cloud-firestore
Maven
./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.googlecloudservices:quarkus-google-cloud-firestore"
Écriture du Repository pour Google Cloud Firestore
Nous allons produire un nouveau repository pour Google Cloud Firestore.
Créer le package com.byoskill.adapters.adoptions.firestore
.
Créer une classe FirestoreAdoptionRepository.java
qui hérite de AdoptionRepository
.
La classe vide ressemblera à ceci :
@ApplicationScoped
@IfBuildProfile(anyOf = "firestore")
public class FirestoreAdoptionRepository implements AdoptionRepository {
@Override
public Multi<Monster> getAllMonsters() {
return null;
}
@Override
public Uni<Monster> addMonsterToAdopt(final Monster monster) {
return null;
}
@Override
public Uni<Monster> getMonsterByUuid(final String id) {
return null;
}
@Override
public Multi<Monster> searchMonstersByName(final String pattern, final Optional<Integer> size) {
return null;
}
@Override
public Multi<Monster> searchMonstersByDescription(final String pattern, final Optional<Integer> size) {
return null;
}
@Override
public void deleteMonsterByUuid(final String id) {
}
@Override
public Uni<Monster> updateMonsterByUUID(final String id, final Monster monster) {
return null;
}
@Override
public Multi<Monster> searchMonstersByAge(final Integer age) {
return null;
}
@Override
public Uni<Monster> changeName(final Monster entityToBeUpdated, final String newName) {
return null;
}
}
Nous avons besoin d'injecter Firestore à la classe pour implémenter les différentes méthodes.
@Inject
Firestore firestore; // Inject Firestore
Voici un exemple simple d'implémentation avec la méthode d'ajout d'adoption :
@Override
@Blocking
public Uni<Monster> addMonsterToAdopt(final Monster monster) {
final CollectionReference persons = firestore.collection("monsters");
final List<ApiFuture<WriteResult>> futures = new ArrayList<>();
monster.setMonsterUUID(UUID.randomUUID().toString());
futures.add(persons.document(monster.getMonsterUUID()).set(monster));
try {
ApiFutures.allAsList(futures).get();
} catch (final InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
return Uni.createFrom().item(monster);
}
Configuration des propriétés pour l'accès à Firestore
Dans un nouveau fichier application-firestore.properties
:
Copier le contenu suivant dans le fichier :
quarkus.google.cloud.project-id=<your-project-id>
quarkus.google.cloud.service-account-location=service-account.json
quarkus.google.cloud.firestore.devservice.enabled=true
quarkus.google.cloud.firestore.database-id=firestore-demo
L'ensemble des propriétés se trouvent ici.
Déploiement sur Google Cloud
Suivre la documentation ici.