Spring Boot 3 - POST service et JPA
On va montrer comment implanter un CRUD en Spring Boot avec JPA et une couche de service.
Le code de cette recette est disponible ici.
- Initialiser le projet
- Modèle de données
- Base de données
- Repository
- Classe de service
- Contrôleur
- Tests
Voici les choix que nous recommandons:
- Système de build : Gradle Kotlin
- Langage : Java
- Version de Spring Boot : 3.4.4 (ou celle cochée par défaut)
- packaging : Jar
- version de java 17
- Metadata
- Group : org.nomprenom
- Artifact : serveur-avec-bd
- Name : serveur-avec-bd
- ajouter dans dependencies:
- Spring Web
- Spring Data JPA
- H2 Database
En cliquant sur "Generate", tu vas télécharger un fichier zip qui contient ton projet.
On va commencer par le modèle de données :
- on crée une classe Truc
- chaque truc contient un id et un champ texte appelé chose :
Spring permet d'utiliser un fichier de propriétés pour fournir la configuration de la base de données :
- il y a un format de fichier spécifique
- le fichier application.properties se trouve dans le dossier resources
On ajoute au fichier application.properties les lignes de code suivantes :
On a les infos suivantes :
- la base de données est H2
- on a le chemin du fichier de la BD
Nous allons ensuite avoir un repository pour accéder à la base de données. Il s'agit d'un objet qui fournit des opérations dans la BD.
On appelle cela parfois également un Data Access Object ou encore DAO (comme dans la librairie du TP3 de 3N5).
Dans notre application, on souhaite proposer uniquement 2 opérations aux utilisateurs :
- ajouter un truc en validant qu'il n'y a pas déjà un truc avec le même chose
- accéder à la liste des trucs
On crée une interface TrucRepo avec ce code :
Les éléments importants ici pour Spring Boot :
- le JpaRepository est une interface qui fournit toutes les méthodes CRUD de base
- on peut ajouter des méthodes juste en les déclarant dans l'interface (Spring Boot va les implémenter par magie)
- par exemple, findByChose est une méthode qui va chercher un truc par son champ chose
Dans notre application on souhaite proposer uniquement 2 opérations aux utilisateurs :
- ajouter un truc en validant qu'il n'y a pas déjà un truc avec le même chose
- accéder à la liste des trucs
On crée une classe TrucService avec ce code :
Les éléments importants ici pour Spring Boot:
- l'annotation @Service sur la classe indique à Spring Boot qu'il s'agit d'un composant injectable
- l'annotation @Autowired sur le repository indique à Spring Boot de fournir un objet de type TrucRepo
- l'objet dont le service est dépendant est injecté par Spring au lieu d'avoir à faire un new TrucRepo
- on parle d'injection de dépendance
On va maintenant pouvoir appeler notre service depuis notre TrucController :
Les éléments importants ici pour Spring Boot:
- on a pu injecter notre service directement dans le contrôleur
- on voit qu'on peut exposer la même méthode de service avec plusieurs méthodes HTTP
On va voir comment écrire des tests pour notre couche de service dans notre code
Les éléments importants ici pour Spring Boot:
- on peut aussi injecter notre service dans les tests, chouette
- on doit partir une instance de Spring Boot avec l'annotation @SpringBootTest cela donne par exemple le contexte pour l'injection de dépendance
- on veut tester sur une base de données qui n'est pas celle du système, ici on fournit un autre fichier de propriétés avec une BD en mémoire vive, que l'on spécifie avec @TestPropertySource :