Formation Java / Spring Boot – Robustesse & qualité industrielle
À l’issue de cette journée, vous serez capable de :
Lien vers un cours complet sur VAVR
Exemple classique :
public Compte trouver(String numero) { Compte c = repository.findByNumero(numero) .orElseThrow(() -> new IllegalArgumentException("Introuvable")); return c; }
Problèmes :
Les exceptions sont puissantes mais parfois trop brutales !
Vavr est une bibliothèque qui apporte…
Dépendance :
<dependency> <groupId>io.vavr</groupId> <artifactId>vavr</artifactId> <version>0.10.4</version> </dependency>
Option est plus riche que Optional.
Option
Optional
Exemple :
Option<Compte> compte = Option.ofOptional( repository.findByNumero(numero) );
Traitement :
compte .map(Compte::getSolde) .getOrElse(BigDecimal.ZERO);
But :
Structure :
Either<Erreur, Resultat>
public Either<String, Compte> trouverCompte(String numero) { return repository.findByNumero(numero) .map(Either::<String, Compte>right) .orElse(Either.left("Compte introuvable !")); }
Avec les Exceptions, on utilise throw et on interrompt le processus.
Avec Either, on retourne une valeur, on compose et on garde le contrôle.
trouverCompte("FR001") .flatMap(compte -> verifierSolde(compte)) .map(compte -> effectuerDebit(compte));
Pas de try/catch, Pas de throw et le flux est plus lisible !
Try.of(() -> service.virer(...)) .onFailure(e -> log.error("Erreur", e)) .onSuccess(r -> log.info("Succès"));
Avant :
public void virer(...) { if (compteSrc == null) throw ... }
Après :
public Either<String, Void> virer(...) { return trouverCompte(src) .flatMap(c -> verifierMontant(c, montant)) .map(c -> { c.debiter(montant); return null; }); }
Either<String, Void> result = service.virer(...); if (result.isLeft()) { return ResponseEntity.badRequest().body(result.getLeft()); } return ResponseEntity.ok().build();
La gestion est explicite et il n’y a pas d’exception technique.
Sonar analyse :
Il donne une mesure objective de qualité.
Pour l’installation avec Docker, nous verrons en fonction des besoin et de l’utilisation par CA-Titres. Finalement, vous n’utilisez pas docker, donc, on trouvera une autre solution.
docker run -d -p 9000:9000 sonarqube:lts
Accès :
http://localhost:9000
Login :
Ajouter plugin :
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.9.1.2184</version> </plugin>
Exécution :
mvn sonar:sonar \ -Dsonar.projectKey=banklite \ -Dsonar.host.url=http://localhost:9000 \ -Dsonar.login=token
Sonar fournit :
Sonar détecte :
Action :
Dans .gitlab-ci.yml :
.gitlab-ci.yml
sonar: stage: test script: - mvn verify sonar:sonar
Vous savez désormais :
APPLICATION COMPLÈTE INTÉGRATIVE AVEC :